5

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

第一的

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

第二

let a = somefunction;

在这两种情况下,以下内容在哪里somefunction

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

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

4

5 回答 5

3

我认为这个例子可能会让差异变得清晰。arguments是一个类似数组的对象,其中包含传递给函数的每个参数。

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

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

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

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

b您的第二个示例直接引用somefunction. 这使得 invokingb与 invoking 相同somefunction

var b = somefunction;

现在,如果您调用其中的每一个ab带有一些参数,您将看到不同之处。

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

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

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

在第二种情况下,参数可用于somefunction,因为某些函数被直接调用。

以下是您如何重新定义a,使其在功能上等同于使用apply

var a = function() { somefunction.apply(this, arguments); }

在您的控制台上运行它会打印参数数组。

=> a('a', 1);
['a', 1]
于 2013-10-27T22:15:49.250 回答
3

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

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

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

于 2013-10-27T21:44:14.280 回答
2

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

在第二种情况下,asomeFunction成为完全相同的东西,调用a()与调用相同someFunction()

于 2013-10-27T22:05:02.940 回答
2
var a = function(){
   somefunction();
}

是一个归因于变量的匿名函数。a

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

是通过Object Literal notation的函数声明。

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

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

于 2013-10-27T21:46:52.163 回答
-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
于 2013-10-27T22:14:15.423 回答