對這段話不是很理解 這個不是說this 引用的是函數(shù)的執(zhí)行環(huán)境么,test的執(zhí)行環(huán)境不應(yīng)該是wo();這個函數(shù)么 為啥會打印出red?
1、列表項目判斷函數(shù)作用域可以把函數(shù)通過window.xx1.xx2()這樣表示一下,最后的xx2才是作用域
2、可以把wo理解成window.wo,所以執(zhí)行時的作用域時window
3、wo里面的test是簡單的函數(shù)調(diào)用,故作用域還是window
如果這樣改就是blue了:
wo.color='blue'
wo.test=function(){
console.warn(this.color);
}
window.wo.test()
tip:最后執(zhí)行時wo點出來的,故執(zhí)行環(huán)境是wo
因為這里的this指向window,所以是red。
關(guān)于this指向的詳解:
(1)、處于全局作用域下的this:
this;/*window*/
var a = {name: this}/*window*/
var b = [this];/*window*/
在全局作用域下,this默認指向window對象。
(2)、處在函數(shù)中的this,又分為以下幾種情況:
a、一般定義的函數(shù),然后一般的執(zhí)行:
var a = function(){
console.log(this);
}
a();/*window*/
this還是默認指向window。
b、一般定義,用new調(diào)用執(zhí)行:
var a = function(){
console.log(this);
}
new a();/*新建的空對象*/
這時候讓this指向新建的空對象,我們才可以給空對象初始化自有變量
c、作為對象屬性的函數(shù),調(diào)用時:
var a = {
f:function(){
console.log(this)
}
}
a.f();/*a對象*/
這時候this指向調(diào)用f函數(shù)的a對象。
(3)、通過call()和apply()來改變this的默認引用:
var b = {id: 'b'};
var a = {
f:function(){
console.log(this)
}
}
a.f.call(b);/*window*/
所有函數(shù)對象都有的call方法和apply方法,它們的用法大體相似,f.call(b);的意思 是,執(zhí)行f函數(shù),并將f函數(shù)執(zhí)行期活動對象里的this指向b對象,這樣標示符解析時,this就會是b對象了。不過調(diào)用函數(shù)是要傳參的。所以,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法執(zhí)行f函數(shù),與用apply方法執(zhí)行f函數(shù)時傳參方式,它們之間的差異,大家一目了然:apply通過數(shù)組的方式傳遞參數(shù),call通過一個個的形參傳遞參數(shù)。
(4)、一些函數(shù)特殊執(zhí)行情況this的指向問題:
a、setTimeout()和setInverval():
var a = function(){
console.log(this);
}
setTimeout(a,0);/*window*/
setInterval()類似。
b、dom模型中觸發(fā)事件的回調(diào)方法執(zhí)行中活動對象里的this指向該dom對象。
理解下面的代碼,你就會明白,調(diào)用環(huán)境是什么意思了
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北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。