JS中關於this的理解
阿新 • • 發佈:2018-12-12
JavaScript:this是什麼? 定義:this是包含它的函式作為方法被呼叫時所屬的物件。 看定義有點懵…… 先來看一個題目:
//以下程式碼輸出什麼?為什麼? var number = 50; var obj = { number: 60, getNum: function () { var number = 70; return this.number; } }; console.log(obj.getNum()); //60 console.log(obj.getNum.call()); //<=> obj.getNum.call(window) 輸出:50 console.log(obj.getNum.call({number:20})); //20
(1)this -> obj getNum()被呼叫,被誰呼叫?被obj呼叫,所以this指向的是obj物件,所以此時輸出60 (2)this -> window call方法是什麼?它可以用來改變this的指向,同時還有一個apply(),它和call()是一樣,區別我們下面再說。 此時this預設繫結在window,所以輸出50 (3)this -> {number : 20} 此時this繫結在物件 {number:20} 上,所以輸出20 call方法呼叫示例:
window.color = 'red'; document.color = 'yellow'; var s1 = {color: 'blue' }; function changeColor(){ console.log(this.color); } changeColor.call(); //red (預設傳遞引數) changeColor.call(window); //red changeColor.call(document); //yellow changeColor.call(this); //red changeColor.call(s1); //blue
call()與apply()的區別: * 接收引數的方式不同(接收兩個引數的時候,第一個引數一樣[作用域],第二個引數不同) call() - 一個個列舉出來 apply() - 陣列
function fn(c,d){
return this.a + this.b + c + d;
}
var s = {a:1, b:2};
console.log(fn.call(s,3,4)); // 1+2+3+4 = 10
console.log(fn.apply(s,[5,6])); // 1+2+5+6 = 14
總結: 一般來說,this總是指向呼叫某個方法的物件,但是使用call()和apply()方法時,就會改變this的指向。 this繫結有四種情況; 預設繫結:函式獨立呼叫時,this預設繫結到window 隱式繫結:看函式呼叫棧,上一個的棧點就是this,console.trace()可檢視函式的呼叫關係 顯式繫結:如call,apply,bind,this指向繫結物件 new繫結:this指向new出來的物件