最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

web面試之JS預解析與變量提升區(qū)別

 更新時間:2021年09月24日 15:01:22   作者:SpringSir  
這篇文章主要介紹了web面試中常會問道的問題,JS函數(shù)預解析與變量提升區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

什么是預解析?

概念:

JS代碼在在代碼從上往下執(zhí)行前,瀏覽器會先把所有變量聲明解析一遍, 這個階段叫預解析。

詳講

尋找作用域中的var 和function聲明(匿名函數(shù)沒有function聲明,所以不會提升),然后對其進行事先聲明, 并把賦值操作留在原地,再從上到下執(zhí)行代碼。這就是一個預解析的過程。

變量和函數(shù)預解析的區(qū)別

​ 在預解析時,會把所有用 var 聲明的變量, 和 function 聲明的函數(shù),提升到所在的作用域最頂端

var聲明的變量, 在預解析的時, 只是提前了聲明, 賦值語句依然留在原地;

function 聲明的函數(shù), 在預解析的時, 會提前聲明并同時定義, 函數(shù)執(zhí)行的時候,函數(shù)內部才會進行預解析。

注意: 匿名函數(shù)沒有function聲明,所以不會提升

重復聲明var變量

var重復聲明時:若已經(jīng)存在,編譯器會忽略 var 繼續(xù)向下編譯;

若不存在,則順著作用域鏈向上查找,

若沒有找到,會在本作用域聲明該變量

變量提升和函數(shù)提升優(yōu)先級

總結:

函數(shù)提升優(yōu)先級高于變量提升,且不會被同名變量聲明時覆蓋,但是會被變量賦值后覆蓋

下面內容轉載自:

https://blog.csdn.net/caoyafeicyf/article/details/53172532

函數(shù)優(yōu)先級大于變量優(yōu)先級的深入探究

瀏覽器的預解析過程

先由一道小題進入本文

var foo;
function foo(){}
console.log(foo);

結果是函數(shù)體function foo(){}
接著下面一道題:

function foo(){}var foo;console.log(foo);

結果也是函數(shù)體

function foo(){}

所有就有很多人說,函數(shù)聲明的優(yōu)先級大于變量聲明的優(yōu)先級。

那么,為什么呢?這就要從瀏覽器的預解析說起了。

預解析流程

搜尋預解析關鍵字

尋找var關鍵字

尋找function關鍵字

執(zhí)行預解析

先應用var關鍵字聲明的標識符,使這些標識符有定義
標識符有定以后,使用這項標識符就不會報錯了但因為沒有賦值,因此其值為undefined

至此標識符中保存了函數(shù)的引用

幾個需要注意的細節(jié)

  • var 關鍵字對同一個標識符重復使用時,除第一次有效外,其他均做忽略處理。
  • 預解析時先處理變量聲明,再處理函數(shù)聲明不
  • 要糾結誰的優(yōu)先級高,這些只是表面現(xiàn)象
  • 懂得了預解析流程,一切都是浮云

看了預解析原理以后,下面咱們回到本文開頭的兩題,分析下預解析的過程,詳細的了解為什么函數(shù)的優(yōu)先級高于變量的優(yōu)先級。follow me

先看第一個

var foo;
function foo(){}
console.log(foo);

預解析過程為:

var foo;<----變量聲明的var
var foo;<----函數(shù)聲明抽出的var
foo=function (){}<----函數(shù)聲明抽出的賦值
console.log(foo);

再來看第二個

function foo(){}
var foo;
console.log(foo);

預解析過程為:

var foo;<----變量聲明的var
var foo;<----函數(shù)聲明抽出的var
foo=function (){}<----函數(shù)聲明抽出的賦值
console.log(foo)

比較這兩個,你發(fā)現(xiàn)了什么?原來他們的預解析過程一樣啊,這也就是為什么函數(shù)優(yōu)先級高于變量的原因了。

如果你理解了上面的內容,那么下面再出一個題:

var a=1;
function a(){}
console.log(a);

這個瀏覽器是如何解析的呢?下面來跟著我的思路一起走:

1. 解析器首先搜尋var 關鍵字,結果第一行就發(fā)現(xiàn)了,把它提取到開頭。
2. 解析器搜尋function關鍵字,第二行發(fā)現(xiàn)了,首先分離var+函數(shù)名,此時發(fā)現(xiàn)和第一步的一樣,不做處理,然后開始分離函數(shù)的賦值,也就是a=function (){},此時a為函數(shù)體。
3. 解析器接著處理變量的賦值,a=1,上一步的函數(shù)體被覆蓋掉,此時a=1。
4. 最后處理console.log(a),自然而然的結果為1。

下面是解析器處理的代碼過程:

var a;<----變量聲明的var
var a;<----函數(shù)聲明抽出的var
a=function (){}<----函數(shù)聲明抽出的賦值
a=1;
console.log(a);

以上就是web面試之JS預解析與變量提升區(qū)別的詳細內容,更多關于JS預解析與變量提升的資料請關注腳本之家其它相關文章!

相關文章

最新評論

河西区| 贵定县| 内乡县| 绥化市| 富蕴县| 兴安盟| 锡林郭勒盟| 栾川县| 台山市| 锡林郭勒盟| 织金县| 象州县| 枝江市| 湖州市| 揭西县| 南平市| 茶陵县| 陆丰市| 申扎县| 自贡市| 南宁市| 黎城县| 平罗县| 洞口县| 沙田区| 油尖旺区| 银川市| 饶平县| 东乌| 天峻县| 集安市| 马山县| 惠水县| 阜平县| 兴安县| 永和县| 咸宁市| 昭平县| 泸水县| 玛多县| 临城县|