我试图在javascript中掌握闭包的概念,并在http://javascriptissexy.com上遇到以下代码:
// This example is explained in detail below (just after this code box).
function celebrityIDCreator (theCelebrities) {
var i;
var uniqueID = 100;
for (i = 0; i < theCelebrities.length; i++) {
theCelebrities[i]["id"] = function () {
return uniqueID + i;
}
}
return theCelebrities;
}
var actionCelebs = [{name:"Stallone", id:0}, {name:"Cruise", id:0}, {name:"Willis", id:0}];
var createIdForActionCelebs = celebrityIDCreator (actionCelebs);
var stalloneID = createIdForActionCelebs[0];console.log(stalloneID.id());//103
在前面的示例中,在调用匿名函数时,i的值为3(数组的长度然后递增)。数字3被添加到uniqueID以为所有名人ID创建103。因此返回数组中的每个位置都得到id = 103,而不是预期的100,101,102。
问题:有人可以向我解释为什么stallonID的值是103而不是100?我迷失在&#34;数字3被添加到uniqueID为所有名人ID创建103.&#34;。
谢谢!
答案 0 :(得分:0)
正如你在这里看到的actionCelebs数组,每个对象元素id引用了尚未运行的闭包函数,直到你像这样访问actionCelebs[1]['id']
,
当该闭包运行时,你知道close更接近通过引用访问外部函数变量,这意味着如果在闭包内引用的外部函数变量发生变化,它也会在外部函数中发生变化。
在你的代码中celebrityIDCreator()
运行for循环,i从0到3,你的闭包函数没有被执行,
所以在celebrityIDCreator()
完成后,celebrityIDCreator()
范围内的值 i = 3 ,
所以当你最终访问createIdForActionCelebs[0]['id']
时,闭包函数会运行,并且在这一行return uniqueID + i
每次从外部函数范围找到i的值为3,这就是为什么你的id总是为103