cari

Rumah  >  Soal Jawab  >  teks badan

skop penutupan js

Mengapa ia dikeluarkan 10 kali bukankah 10 yang ditolak masuk menjadi 1 - 9 Tolong beri saya jawapan kepada perangkap ini

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
}
扔个三星炸死你扔个三星炸死你2809 hari yang lalu804

membalas semua(8)saya akan balas

  • 黄舟

    黄舟2017-06-28 09:30:39

    Anda hanya perlu mencipta fungsi penutupan untuk menyimpan nilai i apabila gelung for dilaksanakan, dan ia boleh dikeluarkan mengikut urutan

    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]());
        //已经变为依次输出
    }

    balas
    0
  • 阿神

    阿神2017-06-28 09:30:39

    在执行点击事件之前,for循环已经执行完,也就是最终获取的是最后 i 的值5。  
    呆神:绑定 和 点击 是两个事件  点击是用户交互的时候发生  绑定在引擎编译代码的时候就发生了~             
    宇神:这样理解吧,你把点击事件当做一个下车事件,而火车从1-4,到4时你才能下车执行事件,此时值为4.

    Artikel yang saya baca pada masa lalu
    Memahami penutupan memerlukan anda menulis kod dan kemudian boleh menggunakannya dalam kod anda sendiri Selain daripada itu, anda hanya boleh menghafalnya dengan menghafal.
    Cina sekolah lama suka membiarkan anak-anak mereka membawa barang-barang semasa mereka masih kecil, tetapi mereka tidak tahu maksudnya dan kadang-kadang mereka tidak dapat menerangkannya dengan jelas. Mereka berharap mereka akan memahaminya secara semula jadi pada satu ketika masa depan
    Di atas
    Jika anda mempunyai pengetahuan asas tertentu Adalah disyorkan untuk membaca log yang saya tulis Jika anda masih tidak faham, tinggalkan mesej dan bertanya kepada saya .com/2084...

    balas
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-28 09:30:39

    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));
    }

    balas
    0
  • 黄舟

    黄舟2017-06-28 09:30:39

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

    Setiap i sebagai balasan merujuk kepada i luaran yang sama, iaitu 10

    balas
    0
  • 黄舟

    黄舟2017-06-28 09:30:39

    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]();
    }
    

    Skop pembolehubah var ialah skop fungsi, bukan skop peringkat blok

    balas
    0
  • 天蓬老师

    天蓬老师2017-06-28 09:30:39

    Rantai skop telah dijana apabila ia dicipta c[i] = function(i){ return i; };Apabila berjalan, skop semasa tidak mempunyai i, dan i skop atas save_i() telah menjadi 10. Adakah anda fikir hasilnya ialah 0~9 Adakah anda fikir skop atas ialah skop global?

    balas
    0
  • 黄舟

    黄舟2017-06-28 09:30:39

    a[i] ialah sekumpulan fungsi apabila ditugaskan, iaitu, ia tidak dilaksanakan, ia juga tidak mendapat i, dan skopnya juga tidak mendapat i

    Apabila anda melaksanakannya di bawah, sekumpulan fungsi ini mula mencari i yang boleh diperolehi dalam skop mereka sendiri, iaitu 10 selepas gelung dilaksanakan

    balas
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:30:39

    Kata kunci

    var mengisytiharkan skop pembolehubah sebagai skop fungsi, jadi pembolehubah i dalam gelung for akan dinaikkan pangkat. Ia akan menjadi ok jika poster menukar bahagian dalam gelung for kepada fungsi laksana sendiri. cth:
    fungsi save_i(){

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

    }

    balas
    0
  • Batalbalas