cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Masalah dengan panggilan js, kod yang sangat mudah, bagaimana untuk mentafsir hasil output?

foo2() menggunakan fungsi anak panah.
Menurut pemahaman panggilan, foo.call({id:23}) seharusnya mengeluarkan 23, bukan 0. Jadi, boleh sesiapa jelaskan ini?
Kod adalah seperti berikut:
<script type="text/javascript">

    function foo() {
        setTimeout(function (){
            console.log('id1:', this.id);
        }, 100);
    }
    
    function foo2() {
        setTimeout(() => {
            console.log('id2:', this.id);
        }, 100);
    }
    
    var id = 0;
    foo.call({id:23});
    foo2.call({id: 2});

</skrip>

Hasil pelaksanaan:
0
2

phpcn_u1582phpcn_u15822697 hari yang lalu722

membalas semua(6)saya akan balas

  • 迷茫

    迷茫2017-06-26 10:52:10

    foo 函数里面的 this 还是 {id:23} 但是到了 setTimeout 接受的回掉里面, this 就变为了 window 所以就输出了全局的 0,第二个因为箭头函数,thisfoo2this mengikat, jadi 2

    balas
    0
  • typecho

    typecho2017-06-26 10:52:10

    Parameter setTimeout foo2 ialah fungsi anak panah, dan ini di dalamnya adalah skop di mana definisi mengikat (apabila foo2 dilaksanakan, ini ialah objek dalam panggilan), dan bukannya menunjuk ke skop di mana masa jalan itu. Fungsi dalam setTimeout biasa terikat pada skop masa jalan (tetingkap).

    balas
    0
  • 代言

    代言2017-06-26 10:52:10

    1. Fungsi foo ini ialah tetingkap, dan fungsi foo2 ini ialah objek {id: 2}.

    balas
    0
  • 巴扎黑

    巴扎黑2017-06-26 10:52:10

    Jelas sekali, yang pertama ini menghala ke tetingkap, dan fungsi anak panah kedua ini menghala ke objek semasa, yang bermaksud sesiapa yang memanggilnya menunjuk kepada sesiapa yang memanggilnya
    Yang pertama boleh ditukar untuk menyelesaikan masalah:

        function foo() {
            var _this = this;
            setTimeout(function (){
                console.log('id1:', _this.id);
            }, 100);
        }
        var id = 0;
        foo.call({id:23});

    balas
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-26 10:52:10

    1. Fungsi panggil balik dalam setTimeout dilaksanakan 100ms selepas foo dilaksanakan, dan skop masa jalan ialah tetingkap.
    2 Fungsi anak panah membenarkan ini dalam setTimeout untuk terikat pada skop di mana ia ditakrifkan, dan bukannya menunjuk ke skop di mana ia dijalankan.

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-26 10:52:10

    Masalah skop fungsi anak panah

    balas
    0
  • Batalbalas