2

我遇到了这个javascript代码。

var digit_name = function() {
    var names = ['zero', 'one','two'];
    return function(n) {
        return names[n];
    };
}();

alert(digit_name(1));

输出为。我知道内部函数被分配给变量digit_name。外层函数代码后第6行需要加括号是什么?谁能说出到底发生了什么?

4

6 回答 6

9

添加的括号使外部函数执行,如果你省略它,它会将外部函数分配给你digit_name而不是内部函数。

于 2012-08-28T18:54:46.010 回答
4

您看到的结尾()使该外部函数立即执行。因此digit_name最终存储了生成的内部函数,而不是指向外部函数的指针。

有关更多信息,请参阅:javascript 中自执行函数的目的是什么?

于 2012-08-28T18:54:58.243 回答
1

让我们给这些函数起一些名字,以便更好地理解发生了什么:

var digit_name = function outer() {
    var names = ['zero', 'one','two'];
    return function inner(n) {
        return names[n];
    };
}();

alert(digit_name(1));

所以,这里有两个函数在起作用:innerouter. 您正在定义一个名为 的函数outer,其目的是创建一个捕获names数组的闭包范围,并定义并返回另一个可以访问此闭包的函数。第 6 行的括号表示调用函数,因此分配给digit_names变量的值不是外部函数,而是内部函数。

于 2012-08-28T18:57:42.463 回答
1

var digit_name = function() {...}; =>digit_name是一个函数

var digit_name = function() {...}();=>digit_name是函数返回的对象

于 2012-08-28T18:58:32.243 回答
0
var digit_name = function() { // Create outer function
    var names = ['zero', 'one','two']; // Define names array, this is done when the outer function is ran
    return function(n) { // Return the new inner function, which gets assigned to digit_name
        return names[n];
    };
}(); // Execute the outer function once, so that the return value (the inner function) gets assigned to digit_name
于 2012-08-28T18:57:07.647 回答
0

这里有两个非常快速的过程。

如果我们要这样写:

function makeDigitReader () { var names; return function (n) { return names[n]; }; }
var myDigitReader = makeDigitReader();

您会正确猜测 myDigitReader 将被赋予内部函数。

他们正在做的是跳过一步。通过添加括号,他们所做的是在定义函数的那一刻触发函数。

所以你正在发生这种情况:

var myDigitReader = function () {
    var names = [...];
    return function (n) { return names[n]; };
};

myDigitReader = myDigitReader();

看看发生了什么?您已将内部函数作为新值返回给曾经是外部函数的值。所以外部函数不再存在,但内部函数仍然可以访问names数组。

您也可以返回对象而不是函数。并且这些对象属性/函数也可以访问最初在函数内部的内容。

通常,您会看到这些立即调用的函数用括号括起来var myClosure = (function() { return {}; }());

如果您打算运行一个而不将其返回值分配给一个值,那么您需要将它放在括号中,或者在它的前面添加某种操作数,以使编译器对其进行评估。

!function () { doStuffImmediately(); }(); // does stuff right away
function () { doStuffImmediately(); }(); // ***ERROR*** it's an unnamed function

希望这能回答您可能遇到的所有问题。

于 2012-08-28T19:04:33.790 回答