我尝试了两种引用函数的方法:
a=function(){
somefunction();
}
a=somefunction;
在这两种情况下somefunction
如下:
somefunction :function() {
alert("hello");
}
这两种方式有什么区别吗?
答案 0 :(得分:3)
是的,您的两个示例之间存在差异。
在第一种情况下,您正在定义一个新的匿名(未命名)函数,该函数调用somefunction
。然后,您将新函数定义分配给变量a
。 a
包含对您的新功能的引用。
在第二种情况下,您只需将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;
现在,如果您使用某些参数调用这些a
和b
中的每一个,您将看到差异。
=> 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