成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

以最簡(jiǎn)單的例子,深入剖析函數(shù)如何進(jìn)行初始化工作,入棧,出棧全過(guò)程

lastSeries / 1929人閱讀

摘要:在一個(gè)函數(shù)中的內(nèi)容執(zhí)行前會(huì)做一些變量的初始化工作,就是圖中下的內(nèi)容。輸出完后,函數(shù)出棧,函數(shù)變?yōu)榛顒?dòng)狀態(tài),因?yàn)闆](méi)有返回值,所以仍然為同時(shí)執(zhí)行下一語(yǔ)句,如下圖執(zhí)行與相同,先是函數(shù)入棧,輸出然后將返回值賦給后出棧。

window.onload = function(){
            debugger;
            var variable1,//定義變量1但沒(méi)有賦值
                variable2 = 2;//定義變量2同時(shí)給其賦值
            variable1 = 1;//給變量1賦值
            function fun1(){//函數(shù)聲明,定義 fun1 函數(shù),沒(méi)有返回值
                alert("im in fun1");
            }
            function fun2(){//函數(shù)聲明,定義 fun2 函數(shù),有返回值
                alert("im in fun2");
                return "returned value from fun2()";
            }
            var variable3 = function(){// 函數(shù)表達(dá)式,將變量3 variable3 指向一個(gè)匿名函數(shù)
                alert("im in a anonymous function")
            }
            var variable4 = fun1;//相當(dāng)于將變量4 variable4 指向fun1 函數(shù),即 variable4 是fun1函數(shù)的一個(gè)引 作用就和變量3 variable3 指向一個(gè)匿名函數(shù)一樣
            var variable5 = fun1();//首先執(zhí)行 fun1() 函數(shù),即輸出 "im in fun1" 字符串,然后執(zhí)行賦值語(yǔ)句,雖然該函數(shù)沒(méi)有返回值,默認(rèn)返回 undefined,即 變量5 variable5="undefined"
            var variable6 = fun2();//和變量5 的過(guò)程一樣,只是fun2 函數(shù)有返回值,所以變量6 variable6="returned value from fun2()"
        }
然后我們一步一步來(lái)剖析


](http://upload-images.jianshu....

一進(jìn)入網(wǎng)頁(yè)就進(jìn)入到 window.onload() 函數(shù)中去,然后暫停到我設(shè)置的斷點(diǎn)處。

然后這時(shí)來(lái)看一下 執(zhí)行上下文棧(就是函數(shù)入棧出棧的那個(gè)地方)

可以看到圖片左上角 的 Call Stack 這里就是函數(shù)調(diào)用棧,在其下方有 window.onload 就說(shuō)明現(xiàn)在處于 window.onload 函數(shù)作用域中。在一個(gè)函數(shù)中的內(nèi)容執(zhí)行前會(huì)做一些變量的初始化工作,就是圖中 Local 下的內(nèi)容。

其中 只有 this 和 函數(shù)聲明 被定義并且被賦值了,就是圖中的 thisfun1,fun2 函數(shù),而其他的變量都只是被定義了而沒(méi)有被賦值所以默認(rèn)為undefined.

這其中就有一個(gè)知識(shí)點(diǎn)了

在函數(shù)做一些準(zhǔn)備工作(就是變量的定義或者賦值)時(shí),this函數(shù)聲明 會(huì)被定義并且賦值,但是直接定義的變量函數(shù)表達(dá)式只是被定義了并為初始值為undefined,只能等到 賦值語(yǔ)句執(zhí)行后 才會(huì)被賦值,下面有圖可以證明

可以看到當(dāng)執(zhí)行 variable2 = 2 時(shí),上面的variable1variable2 仍然是undefined. 但是執(zhí)行到 variable1 = 1;,即 variable2 = 2 執(zhí)行完畢后 variable2 被賦值為 2。同理可知當(dāng)variable1 = 1;執(zhí)行完畢后,variable1才會(huì)被賦值。

當(dāng)執(zhí)行到var variable4 = fun1;時(shí),在其前面的 變量3 variable3 執(zhí)行完賦值語(yǔ)句后被賦值。

當(dāng)執(zhí)行完 var variable4 = fun1;var variable4 指向 fun1 函數(shù)

由圖可知當(dāng)執(zhí)行完 var variable5 = fun1(),第二張圖中 Call Stack 下面有 fun1,window.onload 說(shuō)明 fun1函數(shù)入棧,并進(jìn)入到 fun1函數(shù)內(nèi)部執(zhí)行輸出。

輸出完后,fun1函數(shù)出棧,window.onload 函數(shù)變?yōu)榛顒?dòng)狀態(tài),因?yàn)闆](méi)有返回值,所以variable5仍然為undefined,同時(shí)執(zhí)行下一語(yǔ)句,如下圖:

執(zhí)行var variable6 = fun2();variable5相同,先是fun2函數(shù)入棧,輸出"im in fun2",然后將返回值賦給variable6 后出棧。

window.onload 函數(shù)變?yōu)榛顒?dòng)狀態(tài)后執(zhí)行完所有語(yǔ)句后,出棧,至此函數(shù)的初始化工作和出棧 入棧 就結(jié)束了。

`

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80613.html

相關(guān)文章

  • 理解異步JavaScript

    摘要:當(dāng)函數(shù)結(jié)束,將會(huì)被從調(diào)用棧移出。事件循環(huán)事件循環(huán)的責(zé)任就是查看調(diào)用棧并確定調(diào)用棧是否為空。事件循環(huán)會(huì)再次檢查調(diào)用棧是否為空,如果為空的話,它會(huì)把事件回調(diào)壓入棧中,然后回調(diào)函數(shù)則被執(zhí)行。 寫(xiě)在文章前 這篇文章是翻譯自Sukhjinder Arora的Understanding Asynchronous JavaScript。這篇文章描述了異步和同步JavaScript是如何在運(yùn)行環(huán)境中,...

    ixlei 評(píng)論0 收藏0
  • 解密JavaScript執(zhí)行上下文

    摘要:執(zhí)行上下文棧首先我們先了解一下什么是執(zhí)行上下文棧。那么隨著我們的執(zhí)行上下文數(shù)量的增加,引擎又如何去管理這些執(zhí)行上下文呢這時(shí)便有了執(zhí)行上下文棧。這樣由多個(gè)執(zhí)行上下文的變量對(duì)象構(gòu)成的鏈表就叫做作用域鏈。 執(zhí)行上下文棧 首先我們先了解一下什么是執(zhí)行上下文棧(Execution context stack)。 showImg(https://segmentfault.com/img/remot...

    JeOam 評(píng)論0 收藏0
  • 實(shí)現(xiàn)一個(gè)前端路由,如何實(shí)現(xiàn)瀏覽器前進(jìn)與后退 ?

    摘要:執(zhí)行過(guò)程如下實(shí)現(xiàn)瀏覽器的前進(jìn)后退第二個(gè)方法就是用兩個(gè)棧實(shí)現(xiàn)瀏覽器的前進(jìn)后退功能。我們使用兩個(gè)棧,和,我們把首次瀏覽的頁(yè)面依次壓入棧,當(dāng)點(diǎn)擊后退按鈕時(shí),再依次從棧中出棧,并將出棧的數(shù)據(jù)依次放入棧。 showImg(https://segmentfault.com/img/bVbtK6U?w=1280&h=910); 如果要你實(shí)現(xiàn)一個(gè)前端路由,應(yīng)該如何實(shí)現(xiàn)瀏覽器的前進(jìn)與后退 ? 2. 問(wèn)題...

    劉東 評(píng)論0 收藏0
  • 前端進(jìn)擊巨人(一):執(zhí)行上下文與執(zhí)行棧,變量對(duì)象

    摘要:在中,通過(guò)棧的存取方式來(lái)管理執(zhí)行上下文,我們可稱(chēng)其為執(zhí)行棧,或函數(shù)調(diào)用棧。而處于棧頂?shù)氖钱?dāng)前正在執(zhí)行函數(shù)的執(zhí)行上下文,當(dāng)函數(shù)調(diào)用完成后,它就會(huì)從棧頂被推出理想的情況下,閉包會(huì)阻止該操作,閉包后續(xù)文章深入詳解。 寫(xiě)在開(kāi)篇 已經(jīng)不敢自稱(chēng)前端小白,曾經(jīng)吹過(guò)的牛逼總要一點(diǎn)點(diǎn)去實(shí)現(xiàn)。 正如前領(lǐng)導(dǎo)說(shuō)的,自己喝酒吹過(guò)的牛皮,跪著都得含著淚去實(shí)現(xiàn)。 那么沒(méi)有年終完美總結(jié),來(lái)個(gè)新年莽撞開(kāi)始可好。 進(jìn)擊巨...

    _Suqin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<