摘要:那么對(duì)于有返回值構(gòu)造函數(shù),如何指定呢而從上面,我們可以看出的是這種情況下,不再返回對(duì)象,而是返回語(yǔ)句的返回值。
首先來(lái)看兩個(gè)例子
var user="lilei" function fn(){ console.log(user); console.log(this.user); } fn(); console.log(this.user);
輸出結(jié)果
lilei lilei lilei
這個(gè)很好解釋,user定義的是全局變量,fn調(diào)用的時(shí)候,相當(dāng)于是window.fn(),而this就是指向調(diào)用它的對(duì)象,也就是window,所以第二個(gè)console輸入的是lilei.而在最外層,this.user這里面的this其實(shí)是指向window的,所以也就相當(dāng)于window.user,輸出lilei。
node中輸出
lilei undefined undefined
再看個(gè)例子
function fn(){ var user="lilei" console.log(user); console.log(this.user); } fn(); console.log(this.user);
輸出結(jié)果
lilei undefined undefined
這里面牽涉到局部變量和全局變量相同時(shí),局部變量會(huì)覆蓋全局變量。所以第一個(gè)自然是lilei。此時(shí)函數(shù)內(nèi)部的this調(diào)用指向window,而在全局變量中并未定義user,所以報(bào)undefined。而第三個(gè)和第二個(gè)是一樣的。
有一點(diǎn)需要明確的是,this在創(chuàng)建函數(shù)的內(nèi)部是不知道到底指向誰(shuí),只有在調(diào)用的時(shí)候,方能決定!
var user="lihua" function fn(){ console.log(user); var user="lilei"; console.log(this.user); this.user=123; } fn(); console.log(this.user);
輸出結(jié)果
undefined lihua 123
第一個(gè)之所以打印undefined,是因?yàn)榇a處理分兩個(gè)階段,第一階段是變量,函數(shù)聲明,以及正常格式的參數(shù)創(chuàng)建,這是一個(gè)解析和進(jìn)入上下文的階段。第二個(gè)階段是代碼執(zhí)行,函數(shù)表達(dá)式和不合格的標(biāo)識(shí)符(為聲明的變量)被創(chuàng)建。所以fn就相當(dāng)于
function fn(){ var user; console.log(user); user="lilei"; console.log(this.user); this.user=123; }
打印undefined是自然而然的事情。第二個(gè)打印lihua,沒(méi)什么解釋的。第三個(gè)是因?yàn)樾薷牧藅his.user,所以會(huì)打印123。
也就是說(shuō),this指向的是最后調(diào)用他的對(duì)象。不過(guò)可以通過(guò)call,apply,bind來(lái)改變this的指向。
那么對(duì)于構(gòu)造函數(shù)是如何指向的呢?
function Fn(){ this.user = "lilei"; } var a = new Fn(); console.log(a.user); //lilei
我們發(fā)現(xiàn)這個(gè)this指向a,之所以指向a是因?yàn)閚ew操作符,改變了this的指向。
那么對(duì)于有返回值構(gòu)造函數(shù),this如何指定呢?
function Fn(){ this.user = "lilei"; return 1; } var a = new Fn(); console.log(a.user); //lilei
而
function Fn(){ this.user = "lilei"; return {user:"lihua"}; } var a = new Fn(); console.log(a.user); //lihua
從上面,我們可以看出
return的是Object 這種情況下,不再返回this對(duì)象,而是返回return語(yǔ)句的返回值。a.user的時(shí)候那么調(diào)用的{user:lihua}的值。
這種情況我們可以這樣理解
function Fn(){ this.user = "lilei"; return 1; } var a = new Fn(); 等價(jià)于 function Fn(){} var a = new Object(); a.__proto__ = Fn.prototype; Fn.call(a)
而
function Fn(){ this.user = "lilei"; return {user:"lihua"}; } var a = new Fn(); 等價(jià)于 function Fn(){} var a = new Object(); a.__proto__ = {user:"lihua"}.prototype; {user:"lihua"}.call(a)
如果return的是五種簡(jiǎn)單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined。這種情況下,忽視r(shí)eturn值,依然返回this對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94587.html
摘要:結(jié)構(gòu)其中為整個(gè)項(xiàng)目入口,為中的類,負(fù)責(zé)對(duì)測(cè)試信息進(jìn)行記錄。通過(guò)拋出錯(cuò)誤而不是返回布爾值的方式來(lái)通知用戶,能夠更加明顯的通知用戶,也方便向上拋出異常進(jìn)行傳遞。 背景 為了研究與學(xué)習(xí)某些測(cè)試框架的工作原理,同時(shí)也為了完成培訓(xùn)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的測(cè)試框架的原因,我對(duì)should.js的代碼進(jìn)行了學(xué)習(xí)與分析,現(xiàn)在與大家來(lái)進(jìn)行交流下。 目錄 ext assertion.js assertion-e...
摘要:但是大多數(shù)開箱即用的解決方案用默認(rèn)的選項(xiàng)并不能做出很絢麗的圖表。這篇文章中,我會(huì)教你如何自定義選項(xiàng)來(lái)制作很酷的圖表。我們使用來(lái)作為的打包器。代碼中,使用了一些實(shí)例數(shù)據(jù)和可選參數(shù)傳遞給的數(shù)據(jù)對(duì)象,并且設(shè)置,使得圖表會(huì)充滿外層容器。 showImg(https://segmentfault.com/img/remote/1460000009049816?w=1000&h=424); 本文...
摘要:首先我們打開命令行,切換到項(xiàng)目根目錄下,輸入安裝完成后,請(qǐng)注意,需要把目錄下的所有字體文件拷貝到目錄下,如果沒(méi)有該目錄,請(qǐng)自行創(chuàng)建。 ????????看過(guò)我前面文章的朋友們現(xiàn)在應(yīng)該能正常運(yùn)行自己的第一個(gè)RN應(yīng)用了,那都是小兒科,現(xiàn)在我們來(lái)做點(diǎn)進(jìn)階一點(diǎn)的東西。這篇文章有一些屬于干貨性的東西,請(qǐng)仔細(xì)閱讀。特別需要注意我加粗的部分。????????首先我們來(lái)看下js文件結(jié)構(gòu),在項(xiàng)目初始化成功...
摘要:行代碼,你將擁有一個(gè)現(xiàn)代化規(guī)范測(cè)試驅(qū)動(dòng)高延展性的前端構(gòu)建工具。在閱讀前,給大家一個(gè)小懸念什么是鏈?zhǔn)讲僮髦虚g件機(jī)制如何讀取構(gòu)建文件樹如何實(shí)現(xiàn)批量模板渲染代碼轉(zhuǎn)譯如何實(shí)現(xiàn)中間件間數(shù)據(jù)共享。函數(shù)將參數(shù)中的掛載到上,并返回以便于鏈?zhǔn)讲僮骷纯伞? ES2017+,你不再需要糾結(jié)于復(fù)雜的構(gòu)建工具技術(shù)選型。 也不再需要gulp,grunt,yeoman,metalsmith,fis3。 以上的這些構(gòu)建...
摘要:先引用一句基本都會(huì)引用的句子,但本次并不是介紹兩個(gè)方法的區(qū)別,而是嘗試在中進(jìn)行使用。二應(yīng)用在中在實(shí)例中的中定義了一個(gè)變量,在中打印出來(lái)同時(shí)調(diào)用中的方法。測(cè)試在中直接使用實(shí)踐證明也是可以打印出來(lái)的。 注意:該方法的語(yǔ)法和作用與 apply() 方法類似,只有一個(gè)區(qū)別,就是 call() 方法接受的是一個(gè)參數(shù)列表,而 apply() 方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。 先引用一句基本都會(huì)...
摘要:本篇文章是對(duì)的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你了解打包工具的內(nèi)部原理,在這之前你如果對(duì)不熟悉可以先到官網(wǎng)了解介紹下面是偷懶從官網(wǎng)抄下來(lái)的介紹極速零配置應(yīng)用打包工具極速打包使用進(jìn)程去啟用多核編譯。 showImg(https://segmentfault.com/img/bVbpZRp?w=1241&h=893); 本篇文章是對(duì) Parce 的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你...
閱讀 2538·2021-10-12 10:12
閱讀 1720·2019-08-30 15:52
閱讀 2454·2019-08-30 13:04
閱讀 1741·2019-08-29 18:33
閱讀 967·2019-08-29 16:28
閱讀 454·2019-08-29 12:33
閱讀 2062·2019-08-26 13:33
閱讀 2366·2019-08-26 11:36