亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript中this的問題?

Javascript中this的問題?

楊__羊羊 2019-03-13 10:15:08
對這段話不是很理解 這個不是說this 引用的是函數的執行環境么,test的執行環境不應該是wo();這個函數么 為啥會打印出red?
查看完整描述

4 回答

?
POPMUISE

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對象。


查看完整回答
反對 回復 2019-03-19
?
犯罪嫌疑人X

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

alert(test())是window.alert(test())的簡寫,alert()是全局window的一方法,所以alert(test())是在alert()中執行test(),其this指向當然是window啦!


查看完整回答
反對 回復 2019-03-19
?
德瑪西亞99

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


查看完整回答
反對 回復 2019-03-19
?
眼眸繁星

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


查看完整回答
反對 回復 2019-03-19
  • 4 回答
  • 0 關注
  • 435 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號