亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

javascript - js閉包作用域
扔個(gè)三星炸死你
扔個(gè)三星炸死你 2017-06-28 09:28:39
0
8
854

為什麼會(huì)輸出10 次10 push進(jìn)去的不應(yīng)該是 1 - 9嗎 這個(gè)坑求大神解

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
}
扔個(gè)三星炸死你
扔個(gè)三星炸死你

全部回覆(8)
黃舟

只需要在for迴圈執(zhí)行時(shí),建立一個(gè)閉包函數(shù)將i值儲(chǔ)存起來(lá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]());
    //已經(jīng)變?yōu)橐来屋敵?}
阿神
在執(zhí)行點(diǎn)擊事件之前,for循環(huán)已經(jīng)執(zhí)行完,也就是最終獲取的是最后 i 的值5。  
呆神:綁定 和 點(diǎn)擊 是兩個(gè)事件  點(diǎn)擊是用戶(hù)交互的時(shí)候發(fā)生  綁定在引擎編譯代碼的時(shí)候就發(fā)生了~             
宇神:這樣理解吧,你把點(diǎn)擊事件當(dāng)做一個(gè)下車(chē)事件,而火車(chē)從1-4,到4時(shí)你才能下車(chē)執(zhí)行事件,此時(shí)值為4.

之前過(guò)基礎(chǔ)看過(guò)的文章
理解閉包,要求你寫(xiě)過(guò)一程式碼,而且接下來(lái)在自己的程式碼中也能用到,除些之外,就只能死記硬背了。
老派的國(guó)人喜歡讓小孩子很小的時(shí)候背東西,但是不會(huì)和他們講是什麼意思,有時(shí)也講不清,寄希望於在未來(lái)的某個(gè)時(shí)刻自然而然就懂了
以上
如果你有一定基礎(chǔ),推薦看我寫(xiě)的日誌,再不懂,留言問(wèn)我
http://user.qzone.qq.com/2084...

女神的閨蜜愛(ài)上我

雷雷

黃舟
 a[i] = function(i){
            return i;
        };

return的每個(gè)i都是引用了外部的同一個(gè)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變數(shù)的作用域是函數(shù)作用域,不是區(qū)塊級(jí)作用域

Peter_Zhu

作用域鏈在創(chuàng)建的時(shí)候就已經(jīng)生成了, c[i] = function(i){ return i; };運(yùn)行的時(shí)候當(dāng)前作用域沒(méi)有i,而上層作用域save_i()的i已經(jīng)變成10。你認(rèn)為結(jié)果是0~9,是不是你把上層作用域當(dāng)作全域了

黃舟

a[i]賦值的時(shí)候是一堆function、也就是並沒(méi)有執(zhí)行、也沒(méi)有拿到i、她的作用域也沒(méi)取到i

當(dāng)你在下面執(zhí)行的時(shí)候、這一堆function都開(kāi)始找自己作用域能取到的i、也就是循環(huán)執(zhí)行完的10

巴扎黑

var關(guān)鍵字宣告變數(shù)作用域?yàn)楹瘮?shù)作用域, 因此 for 迴圈中的 i 變數(shù)會(huì)發(fā)生變數(shù)提升。 樓主的將for循環(huán)中的哪一段改為自執(zhí)行函數(shù)就ok了。 eg:
function save_i(){

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

}

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板