当一个变量等于一个函数时,这意味着什么?

可能重复:
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?