好吧,JS中,作用域、閉包和原型都說了,今天我們就再談談this吧,this我更傾向於把它理解成為一個特殊變量,JS解釋器在創建任何活動對象時(參考前面關於作用域的博文),都會創建一個this變量,並且將它指向一個對象(可編碼干預)。下面以代碼為例進行講解。
- 處於全局作用域下的this:
this;/*window*/ var a = {name: this}/*window*/ var b = [this];/*window*/
在全局作用域下,this默認指向window對象。
- 處在函數中的this,又分為以下幾種情況:
- 一般定義的函數,然后一般的執行:
var a = function(){ console.log(this); } a();/*window*/
this還是默認指向window。
- 一般定義,用new調用執行:
var a = function(){ console.log(this); } new a();/*新建的空對象*/
這時候讓this指向新建的空對象,我們才可以給空對象初始化自有變量(參照之前關於原型的博文)。
- 作為對象屬性的函數,調用時:
var a = { f:function(){ console.log(this) } } a.f();/*a對象*/
這時候this指向調用f函數的a對象。
- 一般定義的函數,然后一般的執行:
- 通過call()和apply()來改變this的默認引用:
var b = {id: 'b'}; var a = { f:function(){ console.log(this) } } a.f.call(b);/*window*/
所有函數對象都有的call方法和apply方法,它們的用法大體相似,f.call(b);的意思是,執行f函數,並將f函數執行期活動對象里的this指向b對象,這樣標示符解析時,this就會是b對象了。不過調用函數是要傳參的。所以,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法執行f函數,與用apply方法執行f函數時傳參方式,它們之間的差異,大家一目了然:apply通過數組的方式傳遞參數,call通過一個個的形參傳遞參數。
- 一些函數特殊執行情況this的指向問題:
-
setTimeout()和setInverval():
var a = function(){ console.log(this); } setTimeout(a,0);/*window*/
setInterval()類似。
- dom模型中觸發事件的回調方法執行中活動對象里的this指向該dom對象。
-
this就總結到這里,如有錯誤,歡迎指正O(∩_∩)O