我知道关闭的关键是关于范围。但我不知道它的具体执行顺序。
来自“适用于Web开发人员第3版的专业JavaScript”的经典代码,关于闭包。
function createFunctions(){
var result=new Array();
alert('haha');
for(var i=0;i<10;i++){
result[i]=function(){
alert(i);
return i;
};
}
return result;
}
var a=createFunctions();
令我惊讶的是,'哈哈'被警告,而'i'都没有被警告。我只是将功能分配到变量a。为什么语句“警报('哈哈')”在周期未被警告时被警告执行?
当我添加以下代码时,
var a=createFunctions();
alert(a[2]);
why it alerted like this
function (){
return i;
}
不喜欢
function (){
return 2;
}
此外,当我添加以下代码时,执行语句的顺序将是什么,特别是循环中的语句。
var a=createFunctions();
alert(a[2]());
答案 0 :(得分:1)
致电时
var a=createFunctions()
alert(&#39; haha&#39;)立即执行,并创建一个包含10个函数的数组,并将其分配给变量&#39; a&#39;每个函数警告&#39; i&#39; ;并返回它。
然而,当调用这些函数的任何时(如果你在创建它们之后调用它们),i的值是&#39; 10&#39; (循环终止值)。因此,每次使用
调用其中一个函数时alert(a[x]())
(任何x = 0到9的值) 它将在函数执行时发出警报(10)并在它返回时再次发出警报(10)。
答案 1 :(得分:0)
为什么语句“alert('haha')”被警告
因为它是您调用的函数中的警告语句。
虽然周期没有执行
循环 已执行。循环只是创建一些函数并将它们分配给数组中的位置。你永远不会调用任何这些功能。
当我添加以下代码时,执行语句的顺序是什么
这取决于你添加它的位置。