4 回答

TA貢獻1765條經驗 獲得超5個贊
因為這里的this指向window,所以是red。
關于this指向的詳解:
(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對象。

TA貢獻2080條經驗 獲得超4個贊

TA貢獻1770條經驗 獲得超3個贊
1、列表項目判斷函數作用域可以把函數通過window.xx1.xx2()這樣表示一下,最后的xx2才是作用域
2、可以把wo理解成window.wo,所以執行時的作用域時window
3、wo里面的test是簡單的函數調用,故作用域還是window
如果這樣改就是blue了:
wo.color='blue'
wo.test=function(){
console.warn(this.color);
}
window.wo.test()
tip:最后執行時wo點出來的,故執行環境是wo

TA貢獻1873條經驗 獲得超9個贊
理解下面的代碼,你就會明白,調用環境是什么意思了
var color="red";
//console.log(this);
var __GlobalThis=this;
function wo(){
var color="blue";
var _this=this;
//console.log(_this);
console.log("__GlobalThis===this(wo) is equal?"+(__GlobalThis===this));
function test(){
console.log("__GlobalThis===this(test) is equal?"+(__GlobalThis===this));
return this.color;
}
test()
}
wo();
輸出:
__GlobalThis===this(wo) is equal?true
__GlobalThis===this(test) is equal?true
添加回答
舉報