我遇到了这个javascript代码。
var digit_name = function() {
var names = ['zero', 'one','two'];
return function(n) {
return names[n];
};
}();
alert(digit_name(1));
输出为一。我知道内部函数被分配给变量digit_name。外层函数代码后第6行需要加括号是什么?谁能说出到底发生了什么?
我遇到了这个javascript代码。
var digit_name = function() {
var names = ['zero', 'one','two'];
return function(n) {
return names[n];
};
}();
alert(digit_name(1));
输出为一。我知道内部函数被分配给变量digit_name。外层函数代码后第6行需要加括号是什么?谁能说出到底发生了什么?
添加的括号使外部函数执行,如果你省略它,它会将外部函数分配给你digit_name
而不是内部函数。
您看到的结尾()
使该外部函数立即执行。因此digit_name
最终存储了生成的内部函数,而不是指向外部函数的指针。
有关更多信息,请参阅:javascript 中自执行函数的目的是什么?
让我们给这些函数起一些名字,以便更好地理解发生了什么:
var digit_name = function outer() {
var names = ['zero', 'one','two'];
return function inner(n) {
return names[n];
};
}();
alert(digit_name(1));
所以,这里有两个函数在起作用:inner
和outer
. 您正在定义一个名为 的函数outer
,其目的是创建一个捕获names
数组的闭包范围,并定义并返回另一个可以访问此闭包的函数。第 6 行的括号表示调用函数,因此分配给digit_names
变量的值不是外部函数,而是内部函数。
var digit_name = function() {...};
=>digit_name
是一个函数
var digit_name = function() {...}();
=>digit_name
是函数返回的对象
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
这里有两个非常快速的过程。
如果我们要这样写:
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
希望这能回答您可能遇到的所有问题。