这两个功能有什么区别?

时间:2013-10-27 21:38:49

标签: javascript

我尝试了两种引用函数的方法:

第一

a=function(){
   somefunction();
}

第二

a=somefunction;

在这两种情况下somefunction如下:

somefunction :function() {
  alert("hello");
}

这两种方式有什么区别吗?

5 个答案:

答案 0 :(得分:3)

是的,您的两个示例之间存在差异。

在第一种情况下,您正在定义一个新的匿名(未命名)函数,该函数调用somefunction。然后,您将新函数定义分配给变量aa包含对您的新功能的引用。

在第二种情况下,您只需将somefunction的原始函数指定给变量a即可。变量a然后保存对somefunction的引用。您没有像第一种情况那样创建新功能。

答案 1 :(得分:3)

我认为这个例子可能会有所不同。 arguments是一个类似于对象的数组,它包含传递给函数的每个参数。

尝试在您喜欢的浏览器控制台上运行这些行。

var somefunction = function() { console.log(arguments); };

您的第一个示例演示了在命名函数a周围定义closes的命名函数somefunction

var a = function() { somefunction(); };

您的第二个示例直接向b引用somefunction。这使得调用b与调用somefunction相同。

var b = somefunction;

现在,如果您使用某些参数调用这些ab中的每一个,您将看到差异。

=> a('a', 1);
[]

=> b('a', 1);
['a', 1]

在第一种情况下,arguments对象为空。这是因为传递给a的参数未转发到somefunction

在第二种情况下,somefunction可以使用参数,因为某些函数是直接调用的。

以下是使用apply

重新定义a以便在功能上等效的方法
var a = function() { somefunction.apply(this, arguments); }

在控制台运行此命令会打印参数数组。

=> a('a', 1);
['a', 1]

答案 2 :(得分:2)

var a = function(){
   somefunction();
}

匿名函数是否归因于a变量。

somefunction :function() {
  alert("hello");
}

是通过对象文字符号来声明函数。

创建对象时会显示差异。 匿名函数不能作为“公共”方法,而是以对象文字符号表示,可以从外部访问。

正如Douglas Crockford所说,在JS Good Parts中,第一个声明只是一个函数,第二个声明可能是一个方法。

答案 3 :(得分:2)

在第一种情况下,您正在创建一个调用someFunction()的函数,然后将该函数分配给a,因此现在调用a()会调用一个匿名函数,该函数又调用{ {1}}。

在第二种情况下,someFunction()a完全相同,调用someFunction与调用a()相同。

答案 4 :(得分:-1)

你的问题对我没有意义,
通过访问函数设置var a的方式显然超出了范围。 所以我怀疑你有一个错字:而不是=

var somefunction = function() {
  alert("hello");
};

somefunction(); // hello

...现在你的第一个第二个对上面的代码有意义了:

存储在变量中的

匿名函数

var a = function(){
   alert('Hey');
   somefunction();
};
a(); // Hey // hello

变量作为函数参考

var a = somefunction;
a(); // hello

<小时/> 在另一种情况下:

var objLiteral = {
  somefunction : function() {
      alert("hello");
  }
};

var a = objLiteral.somefunction;
a(); // hello