javascript - Masalah dengan panggilan js, kod yang sangat mudah, bagaimana untuk mentafsir hasil output?
phpcn_u1582
phpcn_u1582 2017-06-26 10:50:10
0
6
743

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_u1582
phpcn_u1582

membalas semua(6)
迷茫

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

typecho

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).

代言

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

巴扎黑

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});
曾经蜡笔没有小新

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.

伊谢尔伦

Masalah skop fungsi anak panah

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan