1. 程式人生 > >JS中關於this的理解

JS中關於this的理解

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出來的物件