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