Loading... 闭包 ---- 作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的整个变量对象,而不是某个特殊的变量,下面例子可以清晰的说明这个问题 ``` function createFun() { let result = new Array(); for(var i = 0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } let funs = createFun(); console.log(funs[0]); //输出10 console.log(funs[1]); //输出10 ``` 每个函数都返回10 因为每个函数的作用域中保存这个createFun()函数的活动对象 所以它们引用的都是同一个变量i。当createFun()函数返回后 变量i的值是10,此时每个函数的引用着保存变量i的同一个变量对象,所以每个函数内部的值都是10。但是在ES6提供了let命令,就解决了这个问题,只需将var变量改成let 就不存在这个问题了 ``` function createFun() { let result = new Array(); for(let i = 0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } let funs = createFun(); console.log(funs[0]); //输出0 console.log(funs[1]); //输出1 ``` Last modification:September 4, 2023 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 1 如果觉得我的文章对你有用,请随意赞赏