1. 程式人生 > >this對象的理解

this對象的理解

有一個 apply 就會 般的 地方 方式 set 作用域 問題

(回答一:)

(1)、js的this指向是不確定的,也就是說是可以動態改變的。call/apply 就是用於改變this指向的函數,這樣設計可以讓代碼更加靈活,復用性更高
(2)、this 一般情況下,都是指向函數的擁有者。
(3)、在函數自執行裏,this 指向的是 window 對象。
擴展:關於this,還有一個地方比較讓人模糊的是在dom事件裏,通常有如下3種情況:
a、使用標簽屬性註冊事件,此時this指向的是window對象。
b、對與a,要讓this指向input,可以將this作為參數傳遞。
c、使用addEventListener等註冊事件。此時this也是指向 input。

回答二:

(1)、處於全局作用域下的this:

this;/*window*/
var a = {name: this}/*window*/
var b = [this];/*window*/


在全局作用域下,this默認指向window對象。
(2)、處在函數中的this,又分為以下幾種情況:
a、一般定義的函數,然後一般的執行:

var a = function(){
console.log(this);
}
a();/*window*/
this還是默認指向window。


b、一般定義,用new調用執行:

var a = function(){
console.log(this);
}
new a();/*新建的空對象*/

這時候讓this指向新建的空對象,我們才可以給空對象初始化自有變量



c、作為對象屬性的函數,調用時:

var a = {
f:function(){
console.log(this)
}
}


a.f();/*a對象*/
這時候this指向調用f函數的a對象。
(3)、通過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通過一個個的形參傳遞參數。
(4)、一些函數特殊執行情況this的指向問題:


a、setTimeout()和setInverval():

var a = function(){
console.log(this);
}
setTimeout(a,0);/*window*/
setInterval()類似。


b、dom模型中觸發事件的回調方法執行中活動對象裏的this指向該dom對象。

this對象的理解