js循环中闭包的变量访问问题



 var str = "abcdefgabcdefg"
for(var i = 0;i<str.length;i++){
    (function(i){
        var str = str;
        console.log(str)
    })(i)   
}


//-->全部都是undefinded

node.js for循环 javascript闭包 JavaScript 闭包

黄昏的颂歌 9 years, 10 months ago

你的代码相当于


 javascript


 var str = "abcdefgabcdefg"
for(var i = 0;i<str.length;i++){
    (function(i){
        var str;
        str = str;
        console.log(str);
    })(i)   
}

所以这种情况下不要和外部变量同名

坑爹呢这是......啪 answered 9 years, 10 months ago

有个答案有错误,这里的IIFE并不会隔断作用域链,相反会延长作用域链,IIFE也同时拥有对上级作用域的访问权限。
至于为什么undefined,是因为var str = str;语句中。str变量在javascript引擎解析被提升(hosting)到当前作用域的顶端


 (function(i){
    var str = str;
})

等同


 (function(i){
       var str;
       str = str;
 })

这里有篇详细的文章。
javascript变量提升


 就像其中答案所说的
你的代码等同于
var str = "abcdefgabcdefg"
for(var i = 0;i<str.length;i++){
    (function(i){
        var str;
        str = str;
        console.log(str);
    })(i)   
}

卧底工资还行 answered 9 years, 10 months ago

Your Answer