首页 > 代码库 > 关于js闭包的误区
关于js闭包的误区
一直以为js的闭包只是内部函数保存了一份外部函数的变量值副本,但是以下代码打破了我的认识:
function createFunctions(){ var result = new Array(); for(var i=0;i<10;++i) { result[i] = function() { return i; } } return result;}var funcs = createFunctions();for(var i=0;i<10;++i){ console.log(funcs[i]());}
执行结果是10个10 而不是0-9
看了JS高级编程7.2.1之后才明白 变量i并不是存在于匿名函数的局部变量表,而是存储在createFunctions的活动对象表(存储参数和局部变量)中。并且在创建函数的定义过程中匿名函数只是被定义而没有被执行。直到后面输出的循环被定义的匿名函数们才得以执行,而这时候它们的活动对象表里并不存在i,然后它们就会从作用域链向上查找createFunctions的活动对象表中的i。这时i的值已经是10,因此它们的执行结果全是10。
以下代码在闭包外部再加入了一个含参数的闭包,并且在定义之后调用,传递进去当前的i。这时这层新增的闭包活动对象表中含有参数num会存储i的当前值。这样结果就是0-9了:
1 function createFunctions() 2 { 3 var result = new Array(); 4 5 for(var i=0;i<10;++i) 6 { 7 result[i] = function(num) 8 { 9 return function(){10 return num;11 }12 }(i);13 }14 return result;15 }16 17 var funcs = createFunctions();18 for(var i=0;i<10;++i)19 {20 console.log(funcs[i]());21 }
闭包的活动对象表中并不会包含this,this是当前执行上下文中的概念,会随着调用环境而变化。
关于js闭包的误区
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。