foo2()採用了箭頭函數。
依照對call的理解,foo.call({id:23})應該輸出23,而不是0。所以,誰能解釋一下嗎?
程式碼如下:
<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});
</script>
執行結果:
0
2
foo
函數裡面的this
還是{id:23}
但是到了setTimeout
接受的回掉裡面,this
就變為了window箭頭函數,
this與
foo2的
this綁定,所以是2
foo2的setTimeout的參數是一個箭頭函數,裡面的this,綁定定義時所在的作用域(foo2執行的時候,this是call中物件),而不是指向執行時間所在的作用域。普通的setTimeout中的函數綁定的是運行時作用域(window)。
1、foo函數的this是window,foo2函數的this是{id: 2}這個物件。
很明顯,第一個this指向的是window,而第二個箭頭函數this指向當前對象,也就是說誰調用,就指向誰;
第一個可以改下解決下:
1、setTimeout中的回呼函數在foo執行100ms後執行,執行階段的作用域是window。
2、箭頭函數可以讓setTimeout裡面的this,綁定定義時所在的作用域,而不是指向執行時所在的作用域。
箭頭函數作用域的問題