在Javascript中使用闭包
我遇到了这个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行中添加括号有什么必要。有人知道到底发生了什么吗?添加的括号使外部函数执
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