javascript - js闭包作用域
扔个三星炸死你
扔个三星炸死你 2017-06-28 09:28:39
[JavaScript讨论组]

为什么会输出10 次10 push进去的不应该是 1 - 9吗 这个坑求大神解答

function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(){
            return i;
        }
    }
    return a;   
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i]());
    //10次 10
}
扔个三星炸死你
扔个三星炸死你

全部回复(7)
黄舟

只需要在for循环执行时,创建一个闭包函数将i值保存起来,既可以依次输出

function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(i){
            return function() {
                return i;
            };
        }(i);
    }
    return a;
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i]());
    //已经变为依次输出
}
女神的闺蜜爱上我
function save_i(){
    var a = [];
    for(var i = 0;i<10;i++){
        a[i] = function(i){
            return i;
        };
    }
    return a;   
}

var c = save_i();
for(var i = 0;i<10;i++){
   console.log(c[i](i));
}
黄舟
 a[i] = function(i){
            return i;
        };

return的每个i都是引用了外部的同一个i 也就是10

黄舟
var fns=[];
function test(){
    for(var i=0;i<10;i++){
        (function(j){
            fns.push(
                function(){
                    console.log(j);
                }
            );
    })(i);    
    
    }

}

test();

for(var k=0;k<fns.length;k++){
    fns[k]();
}

var变量的作用域是函数作用域,不是块级作用域

天蓬老师

作用域链在创建的时候就已经生成了, c[i] = function(i){ return i; };运行的时候当前作用域没有i,而上层作用域save_i()的i已经变成10。你认为结果是0~9,是不是你把上层作用域当做全局了

黄舟

a[i]赋值的时候是一堆function、也就是并没有执行、也没有拿到i、她的作用域也没取到i

当你在下面执行的时候、这一堆function都开始找自己作用域能取到的i、也就是循环执行完的10

巴扎黑

var关键字声明变量作用域为函数作用域, 因此 for 循环中的 i 变量会发生变量提升。 楼主的将for循环中的哪一段改为自执行函数就ok了。eg:
function save_i(){

var a = [],
    i = 0;
for(;i<10;i++){
    a[i] = function(i){
        return i;
    }(i);
}
return a;

}

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号