在Javascript中使用闭包

在Javascript中使用闭包,javascript,function,closures,Javascript,Function,Closures,我遇到了这个javascript代码 var digit_name = function() { var names = ['zero', 'one','two']; return function(n) { return names[n]; }; }(); alert(digit_name(1)); 输出为一个。我知道内部函数被分配给变量数字\u name。在外部函数代码后的第6行中添加括号有什么必要。有人知道到底发生了什么吗?添加的括号使外部函数执

我遇到了这个javascript代码

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

alert(digit_name(1));

输出为一个。我知道内部函数被分配给变量数字\u name。在外部函数代码后的第6行中添加括号有什么必要。有人知道到底发生了什么吗?

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

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


有关更多信息,请参阅:

让我们为这些函数命名,以便更好地了解发生了什么:

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

alert(digit_name(1));

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

var digit\u name=function(){…}=>
数字\u名称
是一个函数


var digit_name=function(){…}()
=>
digital\u 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();
看看发生了什么事? 您已将内部函数作为新值返回给以前的外部函数。 因此外部函数不再存在,但内部函数仍然可以访问
名称
数组

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

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

如果要运行一个函数而不将其返回值赋值,则需要将其放在括号中,或在其前面添加某种操作数,以使编译器对其求值

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

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

搜索“javascript自调用函数”,例如,
names
变量是匿名函数的局部变量如果删除第6行的父项会发生什么?可能与重复
!function () { doStuffImmediately(); }(); // does stuff right away
function () { doStuffImmediately(); }(); // ***ERROR*** it's an unnamed function