首先說明一下,對于ES6新推出的箭頭函數(shù)(() => {}),是無法改變this指向的,因為箭頭函數(shù)中的this在函數(shù)聲明的時候就已經(jīng)指定好了。此處說的更改this指向,是指在函數(shù)(包括匿名函數(shù) function() {})被調(diào)用時,可以更改this的指向。
假設(shè)有如下的代碼:
<body>
<div class="box"></div>
<script>
const box = document.querySelector('.box');
let a, b , c;
const obj = {
fn: function() {
console.log(this);
}
};
obj.fn();
</script>
</body>
當(dāng)執(zhí)行obj.fn()方法時,this的指向是window對象。
如果我想要把this的指向更改為box對象,要如何做呢?有三種方法可以辦到:
- 調(diào)用
call()方法,代碼如下:
obj.fn.call(box, a, b, c);
其第一個參數(shù)為
this要指向的對象,其后的參數(shù)是一個列表。
- 調(diào)用
apply()方法,代碼如下:
obj.fn.apply(box, [a, b, c]);
其第一個參數(shù)為
this要指向的對象,第二個參數(shù)是一個由參數(shù)組成的數(shù)組。
- 調(diào)用
bind()方法,代碼如下:
obj.fn.bind(box, a, b, c)();
bind方法與call方法的參數(shù)格式類似,不同的是調(diào)用bind方法后,會返回一個更改了this指向的新函數(shù),如果要執(zhí)行,還需要在后邊添加()來執(zhí)行。
---(完)---