this的指向(簡單描述版)
函式的呼叫
在JS的物件導向中
this
是表示函式
呼叫相關聯的物件(函式的上下文)。所以要想了解this
的指向,我們先要清楚函式的呼叫的方式
1.作為函式呼叫
function add(a,b) {
return a + b;
}
add(1,2);
以上程式碼就是函式作為函式直接被呼叫,那麼在這種情況下,函式上下文(this)就有兩種可能性質
- 在瀏覽器環境中,this指向了
window
物件 - 在嚴格模式下將會是
undefined
2.作為方法被呼叫
var method = {};
method.add = function () {};
method.add();
當一個函式被賦值給一個物件屬性
,並且通過物件屬性引用的方式時候,函式就會被作為物件的方法被呼叫。那麼在這種情況下,this
指向的就是引用該方法的宿主物件
3.作為建構函式呼叫
let person = new Person();
在使用new
的時候會有如下動作
- 建立一個新物件
- 該物件作為
this
引數傳遞給建構函式,成為建構函式的上下文 - 新建構函式物件作為
new
的返回值
4.使用call
,apply
方法呼叫
function arguNum() {
var result = 0;
for(var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
this.result = result;
}
var obj1 = {};
var obj2 = {};
arguNum.apply(obj1, [1,2,3]); // 6
arguNum.call(obj2, 1,2,3); // 6
使用call
,apply
可以改變this
的指向,call&apply區別在於傳遞的引數是通過什麼方式,call傳遞的是引數列表,apply傳遞的是一個陣列。
結語
關於this的指向是前端面試中經常出現的問題,以上只是暫時簡短總結了一下結果而已,後面會對各個函式呼叫的方式進行深入解析。