我尝试了以下两种引用函数的方法:
第一的
let a = function() {
somefunction();
}
第二
let a = somefunction;
在这两种情况下,以下内容在哪里somefunction
:
function somefunction() {
alert("hello");
}
这两种方式有什么区别吗?
我尝试了以下两种引用函数的方法:
第一的
let a = function() {
somefunction();
}
第二
let a = somefunction;
在这两种情况下,以下内容在哪里somefunction
:
function somefunction() {
alert("hello");
}
这两种方式有什么区别吗?
我认为这个例子可能会让差异变得清晰。arguments
是一个类似数组的对象,其中包含传递给函数的每个参数。
尝试在您最喜欢的浏览器控制台上运行这些行中的每一行。
var somefunction = function() { console.log(arguments); };
您的第一个示例演示了定义一个在命名函数a
周围关闭的命名函数somefunction
。
var a = function() { somefunction(); };
b
您的第二个示例直接引用somefunction
. 这使得 invokingb
与 invoking 相同somefunction
。
var b = somefunction;
现在,如果您调用其中的每一个a
并b
带有一些参数,您将看到不同之处。
=> 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]
是的,您的两个示例之间存在差异。
在第一种情况下,您正在定义一个新的匿名(未命名)函数,该函数调用somefunction
. 然后,您将新函数定义分配给变量a
。 a
包含对您的新功能的引用。
在第二种情况下,您只是将原始函数分配给somefunction
变量a
。然后该变量a
保存对 的引用somefunction
。您没有像在第一种情况下那样创建新功能。
在第一种情况下,您正在创建一个调用 的函数someFunction()
,然后将该函数分配给a
,因此现在调用a()
调用一个匿名函数,该函数又调用someFunction()
.
在第二种情况下,a
并someFunction
成为完全相同的东西,调用a()
与调用相同someFunction()
。
var a = function(){
somefunction();
}
是一个归因于变量的匿名函数。a
somefunction :function() {
alert("hello");
}
是通过Object Literal notation的函数声明。
创建对象时会显示差异。匿名函数不能作为“公共”方法访问,而是在 Object Literal 表示法中,可以从外部访问。
正如 Douglas Crockford 所说,在 JS the Good Parts 中,第一个声明只是一个函数,第二个声明可能是一个方法。
通过访问函数来设置 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