摘要:,對(duì)外公開的接口。更需要注意立即執(zhí)行函數(shù),返回的是一個(gè)匿名函數(shù),也是一個(gè)閉包,在這里一定要注意一個(gè)問題是在進(jìn)入可執(zhí)行上下文時(shí)創(chuàng)建的。三在方法中,注意如下代碼省略代碼的實(shí)際參數(shù)是一個(gè)自執(zhí)行匿名函數(shù),這個(gè)匿名函數(shù)接受了兩個(gè)參數(shù),但只返回了。
function DemoFunction(){ this.init = function(){ var func = (function(va){ this.va = va; return function(){ va += this.va; return va; } })(function(va1, va2){ var va3 = va1 + va2; return va1; }(1,2)); console.log(func(20)); this.func = func; console.log(this.func(100)); } } var a = new DemoFunction(); a.init();
首先我們得有如下幾個(gè)概念:
執(zhí)行上下文:每次當(dāng)控制器轉(zhuǎn)到ECMAScript可執(zhí)行代碼時(shí),即會(huì)進(jìn)入一個(gè)可執(zhí)行上下文,參考文獻(xiàn):深入理解JavaScript系列(11):執(zhí)行上下文(Execution Contexts)
this:this的創(chuàng)建是在 “進(jìn)入執(zhí)行上下文” 時(shí)創(chuàng)建的,在代碼執(zhí)行過程中是不可變的,參考文獻(xiàn):深入理解JavaScript系列(13):This? Yes,this!
自執(zhí)行函數(shù):準(zhǔn)確來說應(yīng)該叫:立即調(diào)用函數(shù)表達(dá)式。因?yàn)樗暶骱蠹磮?zhí)行,參考文獻(xiàn):深入理解JavaScript系列(4):立即調(diào)用的函數(shù)表達(dá)式
詳細(xì)解釋此段代碼
一、首先看DemoFunction的構(gòu)造函數(shù)這是代碼的重點(diǎn),第一層代碼可以縮減為如下:
function DemoFunction(){ this.init = function(){ //省略代碼.... } }
表示為DemoFunction的實(shí)例提供init方法(聲明:此處有誤導(dǎo)成份,方法應(yīng)盡可能放在原型鏈接上,也就是prototype上。),對(duì)外公開的接口。
二、在init方法中,再次省略代碼如下:var func = (function(va){ this.va = va; return function(){ va += this.va; return va; } })(/*省略代碼...*/); //省略代碼....
上面代碼介紹:
首先定義了一個(gè)立即執(zhí)行函數(shù),并把此函數(shù)的執(zhí)行結(jié)果賦值給func。
需要注意立即執(zhí)行函數(shù)中this.va=va這行代碼,由于立即執(zhí)行函數(shù)沒有調(diào)用者,所以在進(jìn)入可執(zhí)行上下文時(shí),this會(huì)被賦值為Global(瀏覽器中為window對(duì)象)。
更需要注意立即執(zhí)行函數(shù),返回的是一個(gè)匿名函數(shù),也是一個(gè)閉包,在這里一定要注意一個(gè)問題:this是在進(jìn)入可執(zhí)行上下文時(shí)創(chuàng)建的。
三、在init方法中,注意如下代碼:var func = (function(va){ this.va = va; return function(){ va += this.va; return va; } })(function(va1, va2){ var va3 = va1 + va2; return va1; }(1,2)); //省略代碼....
va的實(shí)際參數(shù)是一個(gè)自執(zhí)行匿名函數(shù),這個(gè)匿名函數(shù)接受了兩個(gè)參數(shù)va1,va2,但只返回了va1。以此為據(jù),那么可以確定va的值也就為1。接著就執(zhí)行this.va=va這句代碼,由于當(dāng)前this為window,所以參數(shù)va的值被賦值到了window的一個(gè)叫va的屬性上。
四、在init方法中,加上輸出語句:var func = (function(va){ this.va = va; return function(){ va += this.va; return va; } })(function(va1, va2){ var va3 = va1 + va2; return va1; }(1,2)); console.log(func(20)); this.func = func; console.log(this.func(100)); }
結(jié)果分析:
第一個(gè)console.log輸出的是func(20),這里一定要注意調(diào)用者是沒有具體指定的,此時(shí)默認(rèn)的就是Global(也就是widnow對(duì)象),因此輸出為:2
第二個(gè)console.log輸出的是this.func(100),可以看到this.func與func是指向同一個(gè)函數(shù)的引用,但此時(shí)的調(diào)用者則指定為this,也就是當(dāng)前對(duì)象的實(shí)例,因此輸出為:NaN。原因:this(當(dāng)前對(duì)象的實(shí)例)作為調(diào)用者,在func的函數(shù)中va += this.va這句代碼中的this是指向當(dāng)前對(duì)象的實(shí)例,但當(dāng)前對(duì)象的實(shí)例上是沒有va屬性的。但是va是有值的,當(dāng)前值為2了。是因?yàn)殚]包把va值存到內(nèi)存中了。那么如何讓第二次得到的值也是2呢,結(jié)果很簡(jiǎn)單,如下:
function DemoFunction(){ this.va = 0; this.init = function(){ var func = (function(va){ this.va = va; return function(){ va += this.va; return va; } })(function(va1, va2){ var va3 = va1 + va2; return va1; }(1,2)); console.log(func(20)); this.func = func; console.log(this.func(100)); } } var a = new DemoFunction(); a.init();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89849.html
摘要:內(nèi)網(wǎng)調(diào)整引發(fā)的歷史記錄修改及的學(xué)習(xí)由于經(jīng)常變動(dòng)導(dǎo)致本地項(xiàng)目的那些存在地址欄的歷史記錄就都失效了突然腦洞大開有沒有辦法修改本地歷史記錄的方法想法是假設(shè)我原是新是我歷史記錄有我通過某種辦法強(qiáng)行修改歷史記錄將替換成這樣下次在地址欄輸入他就能自動(dòng)填 內(nèi)網(wǎng)IP調(diào)整引發(fā)的Chrome歷史記錄修改及ShadowRoot的學(xué)習(xí) 由于IP經(jīng)常變動(dòng), 導(dǎo)致本地項(xiàng)目的那些存在地址欄的歷史記錄就都失效了, 突...
摘要:內(nèi)網(wǎng)調(diào)整引發(fā)的歷史記錄修改及的學(xué)習(xí)由于經(jīng)常變動(dòng)導(dǎo)致本地項(xiàng)目的那些存在地址欄的歷史記錄就都失效了突然腦洞大開有沒有辦法修改本地歷史記錄的方法想法是假設(shè)我原是新是我歷史記錄有我通過某種辦法強(qiáng)行修改歷史記錄將替換成這樣下次在地址欄輸入他就能自動(dòng)填 內(nèi)網(wǎng)IP調(diào)整引發(fā)的Chrome歷史記錄修改及ShadowRoot的學(xué)習(xí) 由于IP經(jīng)常變動(dòng), 導(dǎo)致本地項(xiàng)目的那些存在地址欄的歷史記錄就都失效了, 突...
摘要:而為對(duì)象時(shí),可用選項(xiàng)如下之所以第三個(gè)參數(shù)有兩種形態(tài),是在舊版本中只存在一個(gè)布爾值,即屬性但隨著時(shí)間推移以及發(fā)展的需要,需要支持設(shè)置更多的特性設(shè)置,所以有了選項(xiàng)這個(gè)對(duì)象傳參,又為了兼容以前的老程序,所以對(duì)兩者進(jìn)行了兼容。 起因 最近在看以前的代碼時(shí),發(fā)現(xiàn)年初在熟悉react hooks新特性時(shí)寫下了這樣一段代碼: let i = 0; function Test(props) { c...
摘要:舉個(gè)栗子中一段簡(jiǎn)單的繼承代碼實(shí)現(xiàn)使用了,不會(huì)報(bào)錯(cuò)這段代碼非常簡(jiǎn)單,在子類中使用了關(guān)鍵字,編譯時(shí)不會(huì)報(bào)錯(cuò),也可以正常執(zhí)行。參考資料從中的講原型鏈與繼承的靜態(tài)屬性和實(shí)例屬性 問題引入 最近一直在看原型繼承相關(guān)的東西,翻到這么一篇文章: 從ES6中的extends講js原型鏈與繼承 文中有一個(gè)點(diǎn)讓我很感興趣,箭頭函數(shù)在繼承過程中無法通過super關(guān)鍵字獲取,這是為什么呢? 前置知識(shí) MDN上...
摘要:圖示如下而對(duì)于引用類型的復(fù)制可不是這樣這個(gè)復(fù)制只是將的引用賦值給,二者是屬于同一個(gè)引用,訪問的都是堆內(nèi)存中的同一個(gè)對(duì)象,任何一個(gè)該引用的變量發(fā)生變化,會(huì)對(duì)其余使用該引用的變量也發(fā)生變化。 這兩天自己在寫代碼的時(shí)候,出現(xiàn)一個(gè)BUG,代碼如下: class Car { constructor(carId) { this.position =...
閱讀 3296·2023-04-26 02:42
閱讀 799·2021-10-09 09:41
閱讀 3242·2021-09-06 15:02
閱讀 760·2019-08-26 10:45
閱讀 488·2019-08-23 15:53
閱讀 748·2019-08-22 18:10
閱讀 557·2019-08-22 18:01
閱讀 3523·2019-08-22 17:34