关于js函数定义方法的困惑

var a=new function(){};
var a=new Function(){};
var a=function(){};
function a(){};

主要是这几个吧,就是不太清楚它们之间的具体区别?

阅读 2.6k
4 个回答

第一个是将function当作构造函数,用new创造一个对象,a会得到function的this。
第二个不出意外会报错,Function是函数的构造对象,在js里,每个函数其实都是Function的对象。
第三个是申明一个变量,将函数表达式赋值给这个变量。
第四个是函数声明。

JS中function是关键字,Function是全局对象(是所有函数的构造函数)。
第一个相当于用new操作符调用了一个匿名函数,因此返回一个对象,typeof a === 'object'
第二个SyntaxError,估计你想表达的是var a=new Function(); 此时a为一个函数
第三个是将右侧的匿名函数表达式赋值给变量a
第四个是函数声明

首先 functionFunction 是有本质上的差异,前者是关键词,后者是Function对象。二者更应该分开来使用。

Function

其实就像是 eval 一样,除性能上是一个诟病以外,也同它一样一不小心很难控制上下文。

另,Function 产生的是全局作用域下的 non-strict 函数。

综合上述,还是不要去用它的好。

不过有时候是必须的,像字符串模板引擎,有兴趣阅读artTemplate的源代码

另,题主的写法是错误的,不应该包括 {}

function

首先通过关键词创建变量实际是一个指针。

而对于3、4声明方式差不多相同,除了解析器优先被识别的差异而已:

-- success
console.log(a());
function a() { return 'ok'; }

-- error
console.log(b());
var b = function() { return 'ok'; }

以上。

这个东西牵扯的面还是比较广的:

  • 先简述一下几个概念:

    1. 构造器

      构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数,
      它只是概念上的一个定义,使用它用来实例化对象。
      对于JavaScript的内置对象,Object、Array、Date等等这些都是构造函数。
                                          ————摘自百度
    2. 函数声明

      构建一个方法可传入参数,执行特定的操作或返回某些值
  • Function

    • Function是所有function的构造函数

    • 可以通过 new Function(/*function string*/)的形式创建一个function

    • var a = new Function();可以创建一个空函数

    • new Function(){}的写法是不正确的

  • new function(/args/)

    • 这个写法会返回一个对象而非函数

    • 这是标准构造函数的用法

    • 构造函数默认返回this值,若构造函数包含return,则返回return的内容

  • function funName(/args/){/TODO:/}

    • 这是一个声明函数的方式

    • 该函数名为funName

    • 基于ES5标准,该函数的name属性为funName的字符串形式

    • 执行该函数的方法为 funName(/args/);传入的参数一般需要提前声明

    • JS中function构成最基本的作用于

  • function(/args/){/TODO:/}

    • 这是另一个声明函数的方式

    • 这种声明方式被称为匿名函数

    • 匿名函数不能独立存在,需要在函数前添加其他操作符,如:

      • (function(){})

      • +function(){}

      • =function(){} 例如 var a=function(){}

      • :function(){} 例如 var a={s:function(){}};

      • ...

    • 匿名函数若被赋值给一个独立变量,则name属性为该变量名的字符串形式

    • 若将一个匿名函数赋值给一个对象的属性,这name属性为空字符串

/*
 * 首先a不是一个函数,而是一个对象
 * function(){}声明了一个空匿名函数
 * new 关键字通过空的匿名函数创建了一个空对象
 */
var a=new function(){};
/*
 * 这里报错
 * Unexpected token {
 * 不应出现{
 */
var a=new Function(){};
/*
 * 声明一个匿名函数
 * 并赋值给变量a
 */
var a=function(){};
/*
 * 声明一个名为a的函数
 */
function a(){};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题