摘要:但實(shí)際上會(huì)將其看成兩個(gè)聲明和。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。所以,就輸出外面的了函數(shù)聲明和變量聲明都會(huì)被提升。局部變量變量聲明提升局部變量由于函數(shù)體內(nèi)存在變量聲明提升,所以上面代碼實(shí)際運(yùn)行如下
在ES6之前,JavaScript沒有塊級(jí)作用域(一對(duì)花括號(hào){}即為一個(gè)塊級(jí)作用域),只有全局作用域和函數(shù)作用域。變量提升即將變量聲明提升到它所在作用域的最開始的部分
引擎會(huì)在解釋 JavaScript 代碼之前首先對(duì)其進(jìn)行編譯(沒錯(cuò),JavaScript
也是要進(jìn)行編譯的?。?,而編譯階段中的一部分工作就是找到所有聲明,并用合適的作用域?qū)⑺麄冴P(guān)聯(lián)起來(lái),即
包括變量和函數(shù)在內(nèi)的所有聲明都會(huì)在任何代碼被執(zhí)行前首先被處理。
1.引擎在解析 JavaScript 代碼之前首先對(duì)其進(jìn)行編譯。編譯階段中的一部分工作就是找到所有的聲明,并用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來(lái);
2.變量和函數(shù)在內(nèi)的所有聲明都會(huì)在任何代碼被執(zhí)行前首先被處理;
3.當(dāng)定義一個(gè) var a = 1; 時(shí),可能會(huì)認(rèn)為這是一個(gè)聲明。但 JavaScript 實(shí)際上會(huì)將其看成兩個(gè)聲明: var a; 和 a = 1; 。第一個(gè)定義聲明是在編譯階段進(jìn)行。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。
**
函數(shù)提升
**
解析器在解析時(shí)對(duì)函數(shù)聲明與函數(shù)表達(dá)式有著不同的優(yōu)先級(jí),實(shí)際上編譯階段函數(shù)聲明會(huì)先于變量被提升,并使其在執(zhí)行任何代碼之前可訪問,函數(shù)表達(dá)式實(shí)際上是變量聲明的一種,因此函數(shù)聲明提升優(yōu)于函數(shù)表達(dá)式
函數(shù)聲明才存在函數(shù)提升
var num = 20; function test(){ console.log(num); // 20 num = 10; //去掉了var 就變成定義了全局變量了 console.log(num); // 10 } test(); console.log(num); // 10
外面的是全局的。里面的可以訪問它,里面定義的在輸出后面,且不能變量提升。所以,就輸出外面的20了
函數(shù)聲明和變量聲明都會(huì)被提升。但是函數(shù)會(huì)首先被提升,然后才是變量。
局部變量 變量聲明提升
var a= 20; function numa(){ console.log(a); // undefined var a= 10; //局部變量 console.log(a); // 10 } numa();
由于函數(shù)體內(nèi)存在變量聲明提升,所以上面代碼實(shí)際運(yùn)行如下:
var a = 20; function numa(){ var a; console.log(a); // undefined a = 10; console.log(a); // 10 } numa();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102421.html
摘要:聲明提升變量和函數(shù)聲明提升發(fā)生在預(yù)編譯階段。上面代碼,函數(shù)內(nèi)相當(dāng)于對(duì)全局變量進(jìn)行賦值函數(shù)聲明提升創(chuàng)建函數(shù)有兩種方式,函數(shù)聲明和函數(shù)表達(dá)式,只有函數(shù)聲明存在提升。同時(shí)聲明變量和函數(shù)顯示的是,初步證明的優(yōu)先級(jí)高于。 聲明提升 變量和函數(shù)聲明提升發(fā)生在JavaScript預(yù)編譯階段。 所謂的聲明提升,就是說(shuō)變量或者函數(shù)在聲明的時(shí)候會(huì)被提前到當(dāng)前作用域的頂部,已經(jīng)處于可訪問狀態(tài)。 變量聲明提升...
摘要:但是碰到聲明提升,這種想法就會(huì)被打破。聲明一個(gè)函數(shù)進(jìn)行相應(yīng)的操作,會(huì)得到函數(shù)聲明提升的結(jié)果。由此可以發(fā)現(xiàn)變量和函數(shù)的聲明都會(huì)被提升在其他代碼的前面執(zhí)行。一個(gè)普通塊內(nèi)部的函數(shù)聲明通常會(huì)被提升到所在的作用域的頂部。的創(chuàng)建初始化和賦值均會(huì)被提升。 Javascript聲明提升 在分析聲明提升之前,我認(rèn)為有必要知道的兩點(diǎn): 一、引擎查詢變量的兩種方式 引擎查詢變量的方式可以分為L(zhǎng)HS和RHS兩...
摘要:代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問題。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段??梢缘弥瘮?shù)聲明提升的優(yōu)先權(quán)大于普通變量聲明。 JavaScript代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問題。 什么是提升 可以簡(jiǎn)單理解為:聲明(變量和函數(shù))都會(huì)被移動(dòng)到各自作用域的最頂端,這個(gè)過程被稱為提升。 具體例子看提升 下面兩個(gè)例子a會(huì)l...
摘要:函數(shù)提升在里有兩種方式創(chuàng)建函數(shù),通過函數(shù)聲明和函數(shù)表達(dá)式。函數(shù)聲明用指定的參數(shù)來(lái)定義函數(shù)。提示不要在中進(jìn)行函數(shù)聲明。問題輸出兩個(gè)都是用函數(shù)聲明的函數(shù),將被提升到的局部作用域頂端。函數(shù)本身將作為函數(shù)聲明在全局范圍內(nèi)提升。 作者關(guān)于提升的話題,總共有兩篇。(后來(lái)又有一個(gè)討論篇),再次搬過來(lái)。水平有限,如果翻譯的不準(zhǔn)確請(qǐng)包涵,并去看原文。下面開始: 這是我之前的關(guān)于提升的文章,標(biāo)題為《用le...
摘要:函數(shù)和變量相比,會(huì)被優(yōu)先提升。這意味著函數(shù)會(huì)被提升到更靠前的位置。僅提升聲明,而不提升初始化。 JavaScript 函數(shù)高級(jí)——執(zhí)行上下文與執(zhí)行上下文棧(圖解+典型實(shí)例分析) 變量提升與函數(shù)提升 變量聲明提升 通過 var 定義(聲明)的變量,在定義語(yǔ)句之前就可以訪問到 值:undefined /* 面試題 : 輸出 undefined */ var a = 3 ...
摘要:要理解函數(shù)的提升行為,讓我們先解析什么是的提升。也就是說(shuō)聲明提升了,賦值還留著原地,等待執(zhí)行。聲明被提升,而包括函數(shù)表達(dá)式的賦值在內(nèi)的賦值操作并不會(huì)提升,而是留在原地等待執(zhí)行。 javaScript自上而下執(zhí)行的順序受到很多新手和部分老手的共識(shí),但是這其實(shí)并不完全正確,這涉及到j(luò)s的編譯過程,這方面我們稍后會(huì)聊到,先考慮下面代碼: window.onload = function(){...
閱讀 2658·2023-04-26 00:56
閱讀 2078·2021-10-25 09:46
閱讀 1317·2019-10-29 15:13
閱讀 884·2019-08-30 15:54
閱讀 2273·2019-08-29 17:10
閱讀 2681·2019-08-29 15:43
閱讀 547·2019-08-29 15:28
閱讀 3102·2019-08-29 13:24