当一个变量等于一个函数时,这意味着什么?
可能重复:
JavaScript:var functionName = function(){} vs function functionName(){}
在JavaScript中,将变量定义为函数的目的是什么? 我以前见过这个约定,并没有完全理解它。
例如,在脚本的某个位置,一个函数就像这样调用:
whatever();
但是我希望看到一个名为whatever
的函数,就像这样:
function whatever(){
}
相反,我会看到一个名为变量whatever
是已定义为一个函数,就像这样:
var whatever = function(){
}
这是什么目的? 你为什么要这样做,而不是仅仅命名该函数?
注意 :请参阅答案末尾的更新,块内的声明变得有效(但如果不使用严格模式,则相当复杂)。
这是一个原因:
var whatever;
if (some_condition) {
whatever = function() {
// Do something
};
}
else {
whatever = function() {
// Do something else
};
}
whatever();
您可能会在初始化库时看到类似的代码,这些代码必须处理实现差异(例如Web浏览器之间的差异,即IE的attachEvent
与标准addEventListener
之间的差异)。 你不能用函数声明来做同样的事情:
if (some_condition) {
function whatever() { // <=== DON'T DO THIS
// Do something
}
}
else {
function whatever() { // <=== IT'S INVALID
// Do something else
}
}
whatever();
...他们没有在控制结构中指定,所以JavaScript引擎可以做他们想做的事情,而不同的引擎做了不同的事情。 (编辑:再次看到下面的注释,它们现在被指定。)
另外,两者之间有很大的区别
var whatever = function() {
// ...
};
和
function whatever() {
// ...
}
第一个是函数表达式,当代码在上下文的逐步执行(例如,它所在的函数或逐步执行的全局代码)中达到该点时对它进行评估。 它也会产生一个匿名函数(引用该变量的变量有一个名称,但该函数没有,这对帮助您的工具提供帮助有意义)。
第二个是函数声明,并且在执行任何分步代码之前 ,在进入上下文时对其进行评估。 (有些人把这称为“提升”,因为来源中的某些东西比源中的某个东西更早出现。)该函数也被赋予一个合适的名称。
所以考虑:
function foo() {
doSomething();
doSomethingElse();
console.log("typeof bar = " + typeof bar); // Logs "function"
function bar() {
}
}
而
function foo() {
doSomething();
doSomethingElse();
console.log("typeof bar = " + typeof bar); // Logs "undefined"
var bar = function() {
};
}
在第一个示例中,对于声明,在doSomething
和其他逐步代码运行之前处理声明。 在第二个例子中,因为它是一个表达式,所以它被作为逐步代码的一部分执行,所以函数没有在上面定义(变量在上面定义,因为var
也是“悬挂”的)。
并结束:目前,你不能在一般的客户端网站的东西做到这一点:
var bar = function foo() { // <=== Don't do this in client-side code for now
// ...
};
你应该可以做到这一点,它被称为命名函数表达式,它是一个函数表达式,它赋予函数一个合适的名称。 但是各种各样的JavaScript引擎在不同的时代已经弄错了,直到最近,IE仍然非常错误。
更新ES2015 +
从ES2015(又名“ES6”)开始,块内的函数声明被添加到规范中。
严格模式
在严格模式下,新指定的行为很简单且易于理解:它们被限制在它们出现的区块中,并被悬挂在其顶部。
所以这:
"use strict";
if (Math.random() < 0.5) {
foo();
function foo() {
console.log("low");
}
} else {
foo();
function foo() {
console.log("high");
}
}
console.log(typeof foo); // undefined
这样可以将函数存储在变量中,例如将它们作为参数传递给其他函数。 这是有用的一个例子是在编写将回调作为参数传递的异步函数
var callback = function() { console.log('done', result)}
var dosomething = function(callback) {
//do some stuff here
...
result = 1;
callback(result);
}
由于函数是JavaScript中的对象,因此您可以使用属性和方法来扩展它们。
当你将一个函数分配给一个变量时,你可以将它作为参数传递给其他函数,并且扩展它以使用Javascript的Object模型。
链接地址: http://www.djcxy.com/p/2831.html上一篇: What does it mean when a variable equals a function?
下一篇: Are named functions or anonymous functions preferred in JavaScript?