摘要:返回作為構(gòu)造器當(dāng)函數(shù)作為構(gòu)造器使用關(guān)鍵詞,它的綁定為新構(gòu)造的對(duì)象。注意當(dāng)然默認(rèn)的構(gòu)造器返回的對(duì)象為當(dāng)前調(diào)用對(duì)象,它能被當(dāng)前對(duì)象中的新對(duì)象所取代如果對(duì)象的返回值不是對(duì)象,那么仍指向當(dāng)前對(duì)象。
javascript this 基礎(chǔ) call apply
Javascript函數(shù)中的this關(guān)鍵字的行為相比其他語言有很多不同。在Javascript的嚴(yán)格模式下和非嚴(yán)格模式下也略有不同。
在大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,在每次函數(shù)被調(diào)用時(shí)this的值也會(huì)不同。ES5增加了bind方法,可以在不對(duì)函數(shù)進(jìn)行調(diào)用的情況下傳入this值。
Global context 全局上下文在全局上下文中(在任何函數(shù)體外部),this指代全局對(duì)象,無論是否在嚴(yán)格模式下。
console.log(this.doucment === document) //true //In web browsers, the window object is also the global object: console.log(this === window); //true this.a = 37; console.log(window.a); //37Function context 函數(shù)上下文
在函數(shù)內(nèi)部, this的值取決于函數(shù)是如何調(diào)用的。
Simple call 直接調(diào)用function f1() { return this; } f1() === window; //global object
在這個(gè)例子中,this的值不是由函數(shù)調(diào)用設(shè)定。因?yàn)榇a不運(yùn)行在嚴(yán)格模式下,this的值始終是一個(gè)對(duì)象且默認(rèn)為全局對(duì)象。
function f2() { "use strict"; return this } f2() === undefined; //return undefined
在嚴(yán)格模式下,this的值根據(jù)執(zhí)行時(shí)的上下文,this所保存的值決定。若為定義,this仍是undefined, 它可能被設(shè)置為任何的值,比如null,42或者是 " I"am not this "。
在第二個(gè)例子中,this的值應(yīng)該是undefined。因?yàn)閒2被調(diào)用時(shí)未基于任何對(duì)象(e.g.window.f2())。這個(gè)功能并未在所有第一次開始支持嚴(yán)格模式的瀏覽器中都得到廣泛支持,在不支持的瀏覽器中,仍然返回window,比如chrome。
As an object method 作為對(duì)象方法當(dāng)一個(gè)函數(shù)作為一個(gè)對(duì)象的方法被調(diào)用,它的this會(huì)被設(shè)置為調(diào)用該方法的對(duì)象。
在下面的例子中,當(dāng)o.f()被調(diào)用,function內(nèi)部的this會(huì)綁定到這個(gè)object。
var o = {}; o.prop = 37; o.f = function() { return this.prop; }; console.log(o.f()); //37
注意,如何調(diào)用或者在何處定義這個(gè)函數(shù)并不影響this的行為,在前一個(gè)例子中,我們?cè)诙x的object中為成員f添加了一個(gè)匿名函數(shù),然而,我們能
更簡便的先定義這些函數(shù)然后再將其附屬到o.f上。這樣做this的行為也是一致。
var o = {prop:37}; function independent(){ return this.prop; } o.f = independent; console.log(o.f()); //logs 37
這個(gè)例子只有o對(duì)象中的f才會(huì)令這個(gè)函數(shù)被調(diào)用。
同樣的,this綁定只會(huì)被最當(dāng)前的引用所決定。在接下來的例子中,當(dāng)我們調(diào)用這個(gè)function,把它當(dāng)作o.b對(duì)象的g方法調(diào)用。在執(zhí)行中,this會(huì)附屬到o.b上。這個(gè)對(duì)象本身作為o的成員沒有結(jié)果,其返回結(jié)果就是當(dāng)前引用。
如下例:
o.b = {g: independent, prop:37} console.log(o.b.g()); //返回37
只要方法是定義在對(duì)象的原型鏈中上面的調(diào)用同樣的仍然正確,如果方法在一個(gè)對(duì)象的原型鏈中,this對(duì)象指向調(diào)用這個(gè)方法的對(duì)象,就像這個(gè)方法存在于這個(gè)對(duì)象中一樣。
var o = { f:function(){return this.a + this.b;} } var p = Object.create(o); p.a = 1; p.b = 5; console.log(p.f()); //6
在此例中,p對(duì)象并沒有它自己的實(shí)例f屬性,它繼承于原型鏈。但是沒有關(guān)系f能在o對(duì)象中找到;查找以一個(gè)p.f的引用開始,因此這個(gè)function中的this取對(duì)象p的引用值。也就是說,當(dāng)f函數(shù)作為p的對(duì)象被調(diào)用,它的this指向p。這是Javascript原型繼承中非常有趣的特征。
當(dāng)方法被getter或者setter調(diào)用同樣的概念仍然成立,當(dāng)對(duì)象的屬性被set或者是gotten時(shí),它的getter或者setter函數(shù)中的this對(duì)象會(huì)被綁定到當(dāng)前對(duì)象。
function modulus(){ return Math.sqrt(this.re*this.re + this.im*this.im); } var o = { re : 1, im : -1, get phase(){ return Math.atan2(this.im,this.re); } }; Object.defineProperty(o,"modulus",{get: modulus,enumerable: true,configurable:true}); console.log(o.phase,o.modulus); //返回-7.86 1.414As a Constructor作為構(gòu)造器
當(dāng)函數(shù)作為構(gòu)造器(使用new關(guān)鍵詞),它的this綁定為新構(gòu)造的對(duì)象。
注意:當(dāng)然默認(rèn)的構(gòu)造器返回的this對(duì)象為當(dāng)前調(diào)用對(duì)象,它能被當(dāng)前對(duì)象中return的新對(duì)象所取代(如果對(duì)象的返回值不是對(duì)象,那么this仍指向當(dāng)前對(duì)象)。
/*注意中示例*/ var o = { a : 12, f : function(){ return this.a; } }; var p = { a : 21, f : function(){ return o.f(); } }; console.log(p.f()); //返回12
構(gòu)造器示例
/* * Constructors work like this: * * function MyConstructor(){ * // Actual function body code goes here. Create properties on |this| as * // desired by assigning to them. E.g., * this.fum = "nom"; * // et cetera... * * // If the function has a return statement that returns an object, that * // object will be the result of the |new| expression. Otherwise, the * // result of the expression is the object currently bound to |this| * // (i.e., the common case most usually seen). * } */ function C(){ this.a = 37; } var o = new C(); console.log(o.a); //返回37 function C2(){ this.a = 38; return {a:38}; } o = new C2(); console.log(o.a); //返回38
在上一個(gè)例子中(c2),因?yàn)橛幸粋€(gè)對(duì)象在構(gòu)建中返回,所以this對(duì)象綁定到了返回的對(duì)象上。
call和apply在function內(nèi)部使用this關(guān)鍵詞時(shí),它的值可以在使用call或apply(所有的function對(duì)象都繼承自Function.prototype)調(diào)用時(shí)綁定為該函數(shù)中傳入的對(duì)象。
function add(c,d) { return this.a + this.b + c + d; } var o = { a : 2, b : 2 } console.log(add.call(o,2,2)); //返回8 console.log(add.apply(o,[2,4])); //返回10Bound functions 綁定函數(shù)
ECMAScript 5介紹 Function.prototype.bind.調(diào)用f.bind(someObject).創(chuàng)建一個(gè)新的function擁有相同的內(nèi)容和作用域,比如f,但是this對(duì)象仍然出現(xiàn)在原來的function中,在新的function中他仍然永久的被綁定在第一個(gè)bind的參數(shù)(someObj)上,比如下面的g函數(shù),無論這個(gè)function被調(diào)用了多少次。
function f(){ return this.a; } var g = f.bind({a : "penouc"}); console.log(g()); var o = {a : 37,f : f, g : g}; console.log(o.f(),o.g());As a DOM event handler 作為一個(gè)DOM事件處理程序
當(dāng)一個(gè)function被用作為一個(gè)事件處理程序,它的this被設(shè)置為當(dāng)前的元素(一些瀏覽器并不遵循這個(gè)規(guī)則而是動(dòng)態(tài)的添加方法比如使用addEventListener)。
//當(dāng)元素被調(diào)用,其被激活為藍(lán)色 function bluify(e) { console.log(this === e.target); console.log(this === e.currentTarget); this.style.backgroundColor = "#A5D9F3"; } //獲得整個(gè)document的元素 var elements = document.getElementsByTagsName("*"); //當(dāng)元素被點(diǎn)擊時(shí)元素被調(diào)用 for(var i = 0; i < elements.length; i++) { elements[i].addEventListener("click",bluify,false); }In an in-line event handler 在行內(nèi)的事件處理程序
當(dāng)代碼被行內(nèi)事件處理程序調(diào)用,它的this就是當(dāng)前元素:
以上警告為button。注意無論如何只有在存在外層代碼才設(shè)置為這樣:
在這個(gè)例子中,內(nèi)部的function的this并未設(shè)置因此返回為window/global對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78084.html
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:作為構(gòu)造函數(shù)調(diào)用中沒有類,但是可以從構(gòu)造器中創(chuàng)建對(duì)象,并提供了運(yùn)算符來進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。如果構(gòu)造函數(shù)顯式的返回一個(gè)對(duì)象,那么則會(huì)指向該對(duì)象。 this 的指向 this 是 js 中定義的關(guān)鍵字,它自動(dòng)定義于每一個(gè)函數(shù)域內(nèi),但是它的指向卻讓人很迷惑。在實(shí)際應(yīng)用中,this 的指向大致可以分為以下四種情況。 1.作為普通函數(shù)調(diào)...
摘要:再來看一個(gè)小的示例淘寶騰訊淘寶為什么輸出的依然是淘寶呢調(diào)用的是對(duì)象中的方法,方法里面有一個(gè)定時(shí)器,而定時(shí)器的一個(gè)參數(shù)是這里的指的就是的對(duì)象,然后方法里面有調(diào)用了,但是定時(shí)器中的指的是對(duì)象,所以最終調(diào)用的是對(duì)象中。 1.看前熱身 看一段代碼 var name = javascript; var obj = { name:js, foo:f...
摘要:當(dāng)然這還沒完,因?yàn)槲覀冞€有重要的一步?jīng)]完成,沒錯(cuò)就是上面的第行代碼,如果沒有這行代碼實(shí)例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對(duì)的,因?yàn)檎G闆r下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動(dòng)更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來講利用原型和原型鏈我們可以做些什么。 普通對(duì)象的繼承 ...
摘要:參數(shù)和是放在數(shù)組中傳入函數(shù),分別對(duì)應(yīng)參數(shù)的列表元素。而原函數(shù)中的并沒有被改變,依舊指向全局對(duì)象。保存原函數(shù)保存需要綁定的上下文剩余的參數(shù)轉(zhuǎn)為數(shù)組返回一個(gè)新函數(shù)下一篇介紹閉包中閉包的詳解。 apply 和 call 的區(qū)別 ECMAScript 規(guī)范給所有函數(shù)都定義了 call 與 apply 兩個(gè)方法,它們的應(yīng)用非常廣泛,它們的作用也是一模一樣,只是傳參的形式有區(qū)別而已。 apply(...
摘要:本文給大家詳細(xì)介紹了下中關(guān)鍵字的使用方法,以及使用關(guān)鍵字的區(qū)別,有需要的小伙伴可以參考下。第行通過關(guān)鍵字創(chuàng)建了一個(gè)新對(duì)象行對(duì)象嘗試訪問和屬性,并調(diào)用方法。一般情況下,函數(shù)對(duì)象在產(chǎn)生時(shí)會(huì)內(nèi)置屬性并將函數(shù)名作為賦值僅函數(shù)對(duì)象。 本文給大家詳細(xì)介紹了下javascript中new關(guān)鍵字的使用方法,以及javascript 使用new關(guān)鍵字的區(qū)別,有需要的小伙伴可以參考下。 function ...
閱讀 1338·2021-09-01 11:40
閱讀 3950·2021-08-05 10:03
閱讀 978·2019-08-30 15:54
閱讀 2820·2019-08-29 12:53
閱讀 3187·2019-08-29 12:23
閱讀 944·2019-08-26 13:45
閱讀 2283·2019-08-26 10:41
閱讀 2540·2019-08-23 16:44