Rumah > Soal Jawab > teks badan
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
迷茫2017-06-26 10:52:10
foo
函数里面的 this
还是 {id:23}
但是到了 setTimeout
接受的回掉里面, this
就变为了 window
所以就输出了全局的 0,第二个因为箭头函数,this
与 foo2
的 this
mengikat, jadi 2
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).
代言2017-06-26 10:52:10
1. Fungsi foo ini ialah tetingkap, dan fungsi foo2 ini ialah objek {id: 2}.
巴扎黑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});
曾经蜡笔没有小新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.