for (var i = 0; i < 10; i++) { dofun[i] = function() { return i; }
}
for (var i = 0; i < 10; i++) { alert(dofun[i]()); }
会输出0到9,因为第二个for循环同样用了 i。但是按正常的理解,第一个for循环,变量 i 经过var的修饰,应该算局部变量了呀,不至于从第二个for循环的 i 中每次赋值啊,所以按理应该是全部输出10才对吧,所以我想问,因为闭包是延迟求值,返回闭包后,对它的求值,外界的同名变量会干扰吗?按我的理解是不会的,我觉得这里应该是有什么地方我遗漏了,所以请各位指点一下。
var i = 0; for (i = 0; i < 10; i ++){ dofun[i] = function(){ return i; } } console.log(i); // i = 10; for (i = 0; i < 10; i++){ //i 0 -> 9 console.log(dofun[i]()); } 因为公用了 都引用了i ,而是第2个for又把i的值覆盖
ECMAScript中的closure"锁定"的不是变量的值, 而是environment; 并且"锁定"的时机也不是在()/return/求值时, 而是在"定义"时. 不信你翻一下262看看在遇到"FunctionDeclaration"这条产生式时编译器需要做什么动作? Entering Function Code时又要做什么动作? 顺便SICP的3.2 The Environment Model of Evaluation也可拿来作为参考, 因为那里描述的也是带upward的模型, 也即js-er所谓的scope chaining.
var dofun = []; var i = 0; // global i for (i = 0; i < 10; i++) { (function() { var that_i = i; // encloure_i dofun[i] = function() { return that_i; } })(); } console.log(i); // i = 10; for (i = 0; i < 10; i++) { //i 0 -> 9 console.log(dofun[i]()); }
第 1 页 / 共 1 页
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。