大家好近迁,我是IT修真院成都分院第5期的學(xué)員首懈,一枚正直純潔善良的web程序員
一.背景介紹:
在Java語言中,this關(guān)鍵字的含義是明確且具體的君编,表示當(dāng)前對象跨嘉。而在javascript中川慌,this是動態(tài)綁定的,它可以是全局對象祠乃、當(dāng)前對象或者任意對象梦重,這完全取決于函數(shù)的調(diào)用方式。這就導(dǎo)致了this具備了多重含義亮瓷,可以使得javascript更靈活的使用琴拧。但是,帶來了靈活性的同時也會給我們初學(xué)者帶來不少困惑嘱支。
二.知識剖析
全局環(huán)境中的this
總結(jié):在全局作用域中它的 this 執(zhí)行當(dāng)前的全局對象(瀏覽器端是 Window蚓胸,node 中是 global)
嚴(yán)格模式 ‘use strict’下的this
原因:this 并不會指向全局挣饥,而是 undefined,這樣的做法是為了消除 js 中一些不嚴(yán)謹(jǐn)?shù)男袨?br>
在javascritp中沛膳,不一定只有對象方法的上下文中才有this扔枫, 全局函數(shù)調(diào)用和其他的幾種不同的上下文中也有this指代。 它可以是全局對象锹安、當(dāng)前對象或者任意對象短荐,這完全取決于函數(shù)的調(diào)用方式。JavaScript 中函數(shù)的調(diào)用有以下幾種方式:作為對象方法調(diào)用叹哭,作為函數(shù)調(diào)用忍宋,作為構(gòu)造函數(shù)調(diào)用,和使用 apply 或 call 調(diào)用风罩。
1.作為對象方法調(diào)用:this 被自然綁定到該對象
varpoint = {
x :0,
y :0,
moveTo :function(x, y){this.x =this.x + x;this.y =this.y + y;
}
};
point.moveTo(1,1)//this 綁定到當(dāng)前對象糠排,即 point 對象
2.作為函數(shù)調(diào)用:this被綁定到全局對象
functionmakeNoSense(x){this.x = x;
}
makeNoSense(5);
x;// x 已經(jīng)成為一個值為 5 的全局變量
3.作為構(gòu)造函數(shù)調(diào)用:this 綁定到新創(chuàng)建的對象上
functionPoint(x, y){this.x = x;this.y = y;
}
注:構(gòu)造函數(shù)不使用new調(diào)用,則和普通函數(shù)一樣泊交。一般地乳讥,構(gòu)造函數(shù)首字母大寫
4.使用 apply 或 call 調(diào)用:在 JavaScript 中函數(shù)也是對象,對象則有方法廓俭,apply 和 call 就是函數(shù)對象的方法云石。
functionPoint(x, y){this.x = x;this.y = y;this.moveTo =function(x, y){this.x = x;this.y = y;
}
}varp1 =newPoint(0,0);varp2 = {x:0, y:0};
p1.moveTo(1,1);
p1.moveTo.apply(p2, [10,10]);
三.常見問題
varobj = {
name:'qiutc',
foo:function(){console.log(this);
},
foo2:function(){console.log(this);
setTimeout(this.foo,1000);
}
}
obj.foo2();
現(xiàn)象:兩次打印的this不一樣
問題二
'use strict';functionfoo(){console.log(this);
}
setTimeout(foo,1);// window
現(xiàn)象:加了嚴(yán)格模式,foo 調(diào)用也沒有指定 this研乒,應(yīng)該是出來undefined汹忠,但是這里仍然出現(xiàn)了全局對象
四.解決方案
問題一可以這么這么解決:利用 閉包 的特性來處理
var obj = {name:'qiutc',
foo: function() {
console.log(this);
},
foo2: function() {
console.log(this);
var_this= this;
setTimeout(function() {
console.log(this);// Windowconsole.log(_this);// Object {name: "qiutc"}},1000);
}
}
obj.foo2();
五.編碼實(shí)戰(zhàn)
五.更多討論
問題1 如何理解this?
回答1:當(dāng)一個函數(shù)被調(diào)用時雹熬,擁有它的object會作為this傳入宽菜。在全局下,就是window or global竿报,其他時候就是相應(yīng)的object铅乡。 也可以看到,call和apply就是利用這一點(diǎn)實(shí)現(xiàn)更改this 值的
六.參考資料
如何理解 JavaScript 中的 this 關(guān)鍵字烈菌?
技能樹.IT修真院
“我們相信人人都可以成為一個工程師阵幸,現(xiàn)在開始,找個師兄芽世,帶你入門挚赊,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷眉闷埃”荠割。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線旺矾,學(xué)習(xí)透明化蔑鹦,成長可見化夺克,師兄1對1免費(fèi)指導(dǎo)『啃啵快來與我一起學(xué)習(xí)吧~
戳我注冊~