解释第一个示例:
Javascript的作用域是函数级的,而不是块级的,创建闭包只是意味着将封闭范围添加到封闭函数的词法环境中。
循环终止后,函数级变量i的值为5,这就是内部函数所看到的。
在第二个示例中,对于每个迭代步骤,外部函数文字将评估为具有自己的作用域和局部变量的新函数对象
num,其值设置为的当前值
i。正如
num从未修改过的那样,它将在闭包的整个生命周期中保持不变:由于函数对象是独立的,下一个迭代步骤不会覆盖旧值。
请记住,这种方法效率很低,因为必须为每个链接创建两个新的功能对象。这是不必要的,因为如果您使用DOM节点进行信息存储,则可以轻松共享它们:
function linkListener() { alert(this.i);}function addlinks () { for(var i = 0; i < 5; ++i) { var link = document.createElement('a'); link.appendChild(document.createTextNode('link ' + i)); link.i = i; link.onclick = linkListener; document.body.appendChild(link); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)