摘要:而中在運(yùn)行期進(jìn)行綁定的,這是中關(guān)鍵字具備多重含義的本質(zhì)原因。那么可解釋為函數(shù)調(diào)用是用進(jìn)行調(diào)用的么這個(gè)明顯不是,進(jìn)入否分支,即函數(shù)是否用進(jìn)行調(diào)用函數(shù)是用進(jìn)行調(diào)用的,即進(jìn)入是分支,即這里的指向中之前的對(duì)象所以
1.前言
在主流的面向?qū)ο蟮恼Z(yǔ)言中(例如Java,C#等),this 含義是明確且具體的,即指向當(dāng)前對(duì)象,一般在編譯期綁定。而 JavaScript 中this 在運(yùn)行期進(jìn)行綁定的,這是JavaScript 中this 關(guān)鍵字具備多重含義的本質(zhì)原因。
JavaScript 中的 this 可以是全局對(duì)象、當(dāng)前對(duì)象或者任意對(duì)象,這完全取決于函數(shù)的調(diào)用方式。
例1.
var point = { 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)前對(duì)象,即point對(duì)象
圖解point.moveTo函數(shù)的this指向什么的解析圖如下圖所示:
例2:
function func(x) { this.x = x; } func(5); //this是全局對(duì)象window,x為全局變量 x;//x => 5
圖解func函數(shù)的this指向什么的解析圖如下圖所示:
例3:
var point = { x : 0, y : 0, moveTo : function(x, y) { // 內(nèi)部函數(shù) var moveX = function(x) { this.x = x;//this 指向什么?window }; // 內(nèi)部函數(shù) var moveY = function(y) { this.y = y;//this 指向什么?window }; moveX(x); moveY(y); } }; point.moveTo(1,1); point.x; //=>0 point.y; //=>0 x; //=>1 y; //=>1
說(shuō)明:
point.moveTo(1,1)函數(shù)實(shí)際內(nèi)部調(diào)用的是moveX()和moveY()函數(shù), moveX()函數(shù)內(nèi)部的this在 “JavaScript this決策樹(shù)“中進(jìn)行判定的過(guò)程是這樣的:
1)moveX(1)函數(shù)調(diào)用是用new進(jìn)行調(diào)用的么?這個(gè)明顯不是,進(jìn)入“否”分支,即函數(shù)是否用dot(.)進(jìn)行調(diào)用?;
2)moveX(1)函數(shù)不是用dot(.)進(jìn)行調(diào)用的,即進(jìn)入“否”分支,即這里的this指向全局變量window,那么this.x實(shí)際上就是window.x;
例4.作為構(gòu)造函數(shù)調(diào)用的例子:
function Point(x,y){ this.x = x; // this ? this.y = y; // this ? } var np=new Point(1,1); np.x;//1 var p=Point(2,2); p.x;//error, p是一個(gè)空對(duì)象undefined window.x;//2
說(shuō)明:
Point(1,1)函數(shù)在var np=new Point(1,1)中的this在 “JavaScript this決策樹(shù)“中進(jìn)行判定的過(guò)程是這樣的:
1)var np=new Point(1,1)調(diào)用是用new進(jìn)行調(diào)用的么?這個(gè)明顯是,進(jìn)入“是”分支,即this指向np;
2)那么this.x=1,即np.x=1;
Point(2,2)函數(shù)在var p= Point(2,2)中的this在 “JavaScript this決策樹(shù)“中進(jìn)行判定的過(guò)程是這樣的:
1)var p= Point(2,2)調(diào)用是用new進(jìn)行調(diào)用的么?這個(gè)明顯不是,進(jìn)入“否”分支,即函數(shù)是否用dot(.)進(jìn)行調(diào)用?;
2)Point(2,2)函數(shù)不是用dot(.)進(jìn)行調(diào)用的?判定為否,即進(jìn)入“否”分支,即這里的this指向全局變量window,那么this.x實(shí)際上就是window.x;
3)this.x=2即window.x=2.
例5.用call 和apply進(jìn)行調(diào)用的例子:
function Point(x, y){ this.x = x; this.y = y; this.moveTo = function(x, y){ this.x = x; this.y = y; }; } var p1 = new Point(0, 0); var p2 = {x: 0, y: 0}; p1.moveTo.apply(p2, [10, 10]);//apply實(shí)際上為p2.moveTo(10,10) p2.x//10
說(shuō)明:
apply 和 call 這兩個(gè)方法允許切換函數(shù)執(zhí)行的上下文環(huán)境(context),即 this 綁定的對(duì)象。
p1.moveTo.apply(p2,[10,10])實(shí)際上是p2.moveTo(10,10)。那么p2.moveTo(10,10)可解釋為:
1)p2.moveTo(10,10)函數(shù)調(diào)用是用new進(jìn)行調(diào)用的么?這個(gè)明顯不是,進(jìn)入“否”分支,即函數(shù)是否用dot(.)進(jìn)行調(diào)用?;
2)p2.moveTo(10,10)函數(shù)是用dot(.)進(jìn)行調(diào)用的,即進(jìn)入“是”分支,即這里的this指向p2.moveTo(10,10)中.之前的對(duì)象p2,所以p2.x=10;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78973.html
摘要:當(dāng)碰到時(shí)呵呵再看一個(gè)呵呵再來(lái)呵呵呵呵呵呵呵呵什么意思呢如果返回值是一個(gè)對(duì)象,那么指向的是構(gòu)造函數(shù)的實(shí)例但是并沒(méi)有被返回,如果返回值不是一個(gè)對(duì)象那么還是指向構(gòu)造函數(shù)創(chuàng)建的實(shí)例。 為什么要學(xué)習(xí)this?如果你學(xué)過(guò)面向?qū)ο缶幊蹋悄憧隙ㄖ栏墒裁从玫?,如果你沒(méi)有學(xué)過(guò),那么暫時(shí)可以不用看這篇文章,當(dāng)然如果你有興趣也可以看看,畢竟這是js中必須要掌握的東西。 1. this指向調(diào)用他的對(duì)象 首先...
摘要:首先,必須搞清楚在里面,函數(shù)的幾種調(diào)用方式普通函數(shù)調(diào)用作為方法來(lái)調(diào)用作為構(gòu)造函數(shù)來(lái)調(diào)用使用方法來(lái)調(diào)用方法箭頭函數(shù)但是不管函數(shù)是按哪種方法來(lái)調(diào)用的,請(qǐng)記住一點(diǎn)誰(shuí)調(diào)用這個(gè)函數(shù)或方法關(guān)鍵字就指向誰(shuí)。 本文主要解釋在JS里面this關(guān)鍵字的指向問(wèn)題(在瀏覽器環(huán)境下)。 首先,必須搞清楚在JS里面,函數(shù)的幾種調(diào)用方式: 普通函數(shù)調(diào)用 作為方法來(lái)調(diào)用 作為構(gòu)造函數(shù)來(lái)調(diào)用 使用apply/call...
摘要:函數(shù)的幾種調(diào)用方式普通函數(shù)調(diào)用作為方法來(lái)調(diào)用作為構(gòu)造函數(shù)來(lái)調(diào)用使用方法來(lái)調(diào)用方法箭頭函數(shù)但是不管函數(shù)是按哪種方法來(lái)調(diào)用的,都需要記住一點(diǎn)誰(shuí)調(diào)用這個(gè)函數(shù)或方法關(guān)鍵字就指向誰(shuí)。作為構(gòu)造函數(shù)來(lái)調(diào)用構(gòu)造函數(shù)出來(lái)的實(shí)例,指向這個(gè)實(shí)例對(duì)象。 首先,了解一下this關(guān)鍵字。this關(guān)鍵字就涉及到函數(shù)調(diào)用的內(nèi)容。函數(shù)的幾種調(diào)用方式: 1 普通函數(shù)調(diào)用2 作為方法來(lái)調(diào)用3 作為構(gòu)造函數(shù)來(lái)調(diào)用4 使用ap...
摘要:出于這個(gè)原因,該函數(shù)返回的,所以在這里指的是,所以返回的是第一個(gè)說(shuō)明關(guān)鍵字通常在對(duì)象的構(gòu)造函數(shù)中使用,用來(lái)引用對(duì)象。重寫(xiě)無(wú)法重寫(xiě),因?yàn)樗且粋€(gè)關(guān)鍵字。結(jié)論,表示當(dāng)前的上下文對(duì)象是一個(gè)對(duì)象,可以調(diào)用對(duì)象所擁有的屬性,方法。 在《javaScript語(yǔ)言精粹》這本書(shū)中,把 this 出現(xiàn)的場(chǎng)景分為四類(lèi),簡(jiǎn)單的說(shuō)就是: 有對(duì)象就指向調(diào)用對(duì)象 沒(méi)調(diào)用對(duì)象就指向全局對(duì)象 用new構(gòu)造就指向新對(duì)...
摘要:面向?qū)ο缶幊讨赶蛞???偨Y(jié)的值要等到代碼真正執(zhí)行是才能確定。,調(diào)用,只想我們指定的對(duì)象后續(xù)更新。對(duì)象調(diào)用,如執(zhí)行,指向。默認(rèn)的,指向全局變量。特殊雖然也是對(duì)象,但是在這里還是指向那個(gè)函數(shù)的實(shí)例,因?yàn)楸容^特殊。 面向?qū)ο缶幊?--- this指向 一。首先:, this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰(shuí),實(shí)際上this的最...
閱讀 2345·2021-11-11 16:54
閱讀 2596·2021-09-26 09:47
閱讀 3978·2021-09-08 09:36
閱讀 2727·2021-07-25 21:37
閱讀 927·2019-08-30 15:54
閱讀 2540·2019-08-30 14:22
閱讀 3245·2019-08-30 13:57
閱讀 2558·2019-08-29 17:17