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
foo
函数里面的this
还是{id:23}
但是到了setTimeout
接受的回掉里面,this
就变为了window
所以就输出了全局的 0,第二个因为箭头函数,this
与foo2
的this
mengikat, jadi 2Parameter 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:
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