摘要:因為塊中只能包含語句,而不能包含函數(shù)聲明這樣的源元素。但是,規(guī)范明確規(guī)定了表達(dá)式語句不能以關(guān)鍵字開頭。所以我們代碼中的是在中只能被視為函數(shù)表達(dá)式,而不是函數(shù)聲明,不會被提前編譯解析。
今天在學(xué)習(xí) 前端工程師手冊 > 關(guān)于函數(shù) 章節(jié)時收獲一點(diǎn)點(diǎn)知識,做個記錄并分享一下。
我們先從看兩段代碼,再來分析。
代碼1:
function foo() { return 1; } var foo = function() { return 2; } foo(); //結(jié)果是 2
代碼2:
var foo = function(){ return 2;} function foo() { return 1; } foo(); //結(jié)果是 2
*知識點(diǎn):在當(dāng)前作用域下,函數(shù)聲明會被最先提前被編譯執(zhí)行,如本文:function foo(){}
所以上面代碼類似于:
代碼1:
function foo() { return 1; } var foo = function() { return 2; } foo(); ↓↓ (編譯后) var foo = function() { return 1; } foo = function() { return 2; } foo();
代碼2:
var foo = function() { return 2; } function foo() { return 1; } foo(); ↓↓ (編譯后) var foo = function(){return 1;}//function foo() { return 1; }被提到最前面了 foo = function(){return 2;} foo();
再來看另一種情況:
if (true) { function foo() { return 1; } } function foo() { return 2; } foo(); //結(jié)果 1
我們還是按照上面邏輯進(jìn)行解讀:
if (true) { function foo() { return 1; } } function foo() { return 2; } foo(); ↓↓ (編譯后) var foo = function () { return 2; } if (true) { var foo = function () { return 1; } } foo();
可能有人會疑問:為什么function foo () { return 1; } 沒有被提前呢?
因為函數(shù)聲明只能出現(xiàn)在程序或函數(shù)體內(nèi)。從句法上講,它們 不能出現(xiàn)在Block(塊)({ ... })中,例如不能出現(xiàn)在 if、while 或for 語句中。因為 Block(塊) 中只能包含Statement語句,
而不能包含函數(shù)聲明這樣的源元素。另一方面,仔細(xì)看一看規(guī)則也會發(fā)現(xiàn),唯一可能讓表達(dá)式出現(xiàn)在Block(塊)中情形,就是讓它作為表達(dá)式語句的一部分。但是,規(guī)范明確規(guī)定了表達(dá)式語句不能以關(guān)鍵字function開頭。而這實際上就是說,函數(shù)表達(dá)式同樣也不能出現(xiàn)在Statement語句或Block(塊)中(因為Block(塊)就是由Statement語句構(gòu)成的)。
所以我們代碼中的function foo () { return 1; } 是在if中,只能被視為函數(shù)表達(dá)式,而不是函數(shù)聲明,不會被提前編譯解析。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/81545.html
摘要:所以變量聲明提升和函數(shù)聲明提升會出現(xiàn)一個先后順序預(yù)編譯過程結(jié)束。 先科普: 1.javaScript是解釋型語言,就是編譯一行,執(zhí)行一行.....2.javaScript沒有塊級及作用域......3.javaScript具有變量和函數(shù)聲明提升功能.....4.AO對象和GO對象....5.預(yù)編譯就是解決代碼執(zhí)行順序問題,與java語言類似(jvm).... 例如: (function...
摘要:這是因為我們訪問了數(shù)組中不存在的數(shù)組元素它超過了最后一個實際分配到內(nèi)存的數(shù)組元素字節(jié),并且有可能會讀取或者覆寫的位。包含個元素的新數(shù)組由和數(shù)組元素所組成中的內(nèi)存使用中使用分配的內(nèi)存主要指的是內(nèi)存讀寫。 原文請查閱這里,本文有進(jìn)行刪減,文后增了些經(jīng)驗總結(jié)。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第三章。 我們將會討論日常使用中另一個被開發(fā)...
摘要:以上簡單總結(jié)了下對執(zhí)行上下文和變量對象的理解,主要在于記錄總結(jié)一下學(xué)習(xí)成果,目前文章的水平實在不敢談分享。 執(zhí)行上下文(Execution Context) 文章同步到github javaScript中的執(zhí)行上下文和變量對象 JavaScript代碼執(zhí)行的過程,包括編譯和執(zhí)行兩個階段,編譯就是通過詞法分析,構(gòu)建抽象抽象語法樹,并編譯成機(jī)器識別的指令,在JavaScript代碼編譯階段...
摘要:而事件分為個級別級事件處理程序,級事件處理程序和級事件處理程序。級中沒有規(guī)范事件的相關(guān)內(nèi)容,所以沒有級事件處理。 showImg(https://segmentfault.com/img/bVburYR?w=499&h=400); HTML依托于JavaScript來實現(xiàn)用戶與WEB網(wǎng)頁之間的動態(tài)交互,接收用戶操作并做出相應(yīng)的反饋,而事件在此間則充當(dāng)橋梁的重要角色。 日常開發(fā)中,經(jīng)常會...
閱讀 2384·2021-11-23 09:51
閱讀 5854·2021-09-22 15:39
閱讀 3409·2021-09-02 15:15
閱讀 3560·2019-08-30 15:54
閱讀 2418·2019-08-30 15:53
閱讀 1460·2019-08-30 14:04
閱讀 2516·2019-08-29 18:33
閱讀 2482·2019-08-29 13:08