需要有关javascript闭包代码示例的帮助

时间:2017-11-14 02:51:39

标签: javascript closures

我试图在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;。

谢谢!

1 个答案:

答案 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 enter image description here