鍍金池/ 問答/HTML/ 循環(huán)里匿名函數(shù)的返回值問題

循環(huán)里匿名函數(shù)的返回值問題

在循環(huán)中使用匿名函數(shù)時(shí),匿名函數(shù)的返回值都是5,導(dǎo)致結(jié)果為arr=[5,5,5,5,5]

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(){
            return i  
        };
    };
    return arr;
};

var b = box();
for(var i=0;i<5;i++){
    alert(b[i]());   
};

但如果我要得到結(jié)果arr = [0,1,2,3,4],我就得把i作為參數(shù)傳進(jìn)去并且自我執(zhí)行

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = (function(i){
            return i  
        })(i);
    };
    return arr;
};

var b = box();
for(var i=0;i<5;i++){
    alert(b[i]);   
};

請問這是怎么理解的,為什么直接返回i就只能得到i的最終值5?謝謝各位解答!

回答
編輯回答
解夏

典型的閉包,函數(shù)作用域
一個(gè)例子:

var index = 1;
var b = function(){
    console.log(index);
}
index = 2;
b();//輸出2 是因?yàn)檎{(diào)用的時(shí)候才取全局index的值
var index = 1;
var b = (function(i){
    return i  //這里形成獨(dú)立作用域
})(index);
index = 2;
b();//輸出1 是因?yàn)檎{(diào)用的時(shí)候取的是(function(){})(index)這個(gè)函數(shù)作用域內(nèi)的index
2017年10月12日 10:42
編輯回答
不歸路

閉包函數(shù)延遲綁定,只有在調(diào)用的時(shí)候才會(huì)計(jì)算i的值,此時(shí)i的值循環(huán)到了5,第二種情況是因?yàn)榇藭r(shí)的i是實(shí)參i,已經(jīng)計(jì)算得出了

2017年3月25日 08:36