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

資訊專欄INFORMATION COLUMN

JS難點(diǎn)之hoist

biaoxiaoduan / 1436人閱讀

摘要:但是變量只有其聲明被提前在作用域的最開(kāi)始處,賦值結(jié)果仍然還在原來(lái)位置。

這篇博文是之前在CSDN寫(xiě)的,現(xiàn)在移至sf。

有過(guò)C或者Java類編程經(jīng)驗(yàn)的同學(xué),對(duì)于“先聲明后使用”的規(guī)則很熟悉,如果使用未聲明的變量或者函數(shù),編譯時(shí)程序會(huì)報(bào)錯(cuò)!但是,JavaScript卻是一個(gè)‘大奇葩’,可以在變量或者函數(shù)聲明之前使用,現(xiàn)在根據(jù)我的理解在做一下說(shuō)明。

首先說(shuō)明JS的hoist分為變量hoist函數(shù)hoist兩種。

一、變量hoist

看一段程序

???????var?a=10;??
???????function?fun(){??
?????????console.log(a);??
?????????var?a=100;??
?????????console.log(a);??
??????}??
???????fun();//undefined???100??
???????console.log(a);//10??

?

我們知道在js中,作用域分為全局作用域和函數(shù)作用域兩種(ES6新特性,增加了塊級(jí)作用域,另做說(shuō)明)。全局變量聲明有三種方式:

var(關(guān)鍵字)+變量名(標(biāo)識(shí)符)方式在function外部聲明,顯示聲明

沒(méi)有使用var,直接給標(biāo)識(shí)符賦值,隱式聲明

使用window全局對(duì)象來(lái)聲明,全局對(duì)象的屬性也應(yīng)是全局變量?eg:window.test=50;?alert(test);

??

好,很顯然,var?a=10;在程序中是全局變量。那么,按照我們正常的邏輯輸出結(jié)果為:10??100??10。但是,實(shí)際輸出結(jié)果為:undefined 100??10,其實(shí)是JS解析器的解析原因,它會(huì)將當(dāng)前作用域中聲明的所有變量和函數(shù),放在作用域的最開(kāi)始處。但是變量只有其聲明被提前在作用域的最開(kāi)始處,賦值結(jié)果仍然還在原來(lái)位置。上述代碼對(duì)于解析器來(lái)說(shuō),其實(shí)是:

???????var?a=10;??
???????function?fun(){
??????????var?a;??
????????? console.log(a);??
??????????a=100;??
????????? console.log(a);??
???????}??

???????fun();//undefined???100??
???????console.log(a);//10
二、函數(shù)hoist

?
講完變量hoist,現(xiàn)在再講一下函數(shù)hoist,函數(shù)hoist又分為兩種情況。一種是函數(shù)聲明,另一種是函數(shù)作為值賦值給變量。

先說(shuō)第一種情況:

???fun();//2??

???function?fun(){console.log(2);}?

在這種情況下,可以看出,函數(shù)JS解釋器允許在函數(shù)聲明之前使用函數(shù),其實(shí)也就說(shuō)明,在這種情況,不僅函數(shù)名提前了,同時(shí),函數(shù)體也被提前。所以可以上述代碼可以執(zhí)行。再說(shuō)第二種情況:

?????fun();??
?????var?fun=function(){??
????????console.log(2);??
?????}

結(jié)果為:Uncaught?TypeError:?fun?is?not?a?function??可以看出在此例中,函數(shù)只是變量聲明聲明提前,但是賦值沒(méi)有提前,并且被提前的變量默認(rèn)為undefined,所以報(bào)的錯(cuò)誤類型為“typeerror”,因?yàn)閡ndefined不是函數(shù),不能被調(diào)用。

三、變量名和函數(shù)名相同時(shí)的hoist
???????function?fun(){console.log(1);}??
???????fun();//2??
???????function?fun(){console.log(2);}??
???????fun();//2??
???????var?fun=100;??
???????console.log(fun);//100??
???????fun();//報(bào)錯(cuò)

在此例中,函數(shù)名和變量名相同,都是fun,都會(huì)提前,那么在提前時(shí),有什么需要注意的地方呢??

函數(shù)聲明比變量聲明更置頂

聲明過(guò)得變量不會(huì)重復(fù)聲明

??

所以上述代碼等效于:

    function?fun(){console.log(1);}??
?????function?fun(){console.log(2);}//函數(shù)體覆蓋上一層函數(shù)體??
?????var?fun;//實(shí)際無(wú)效??
?????fun();??
?????fun();??
?????fun=100;??
?????console.log(fun);??
?????fun();

以上就是本人對(duì)于JS的hoist問(wèn)題的理解,如果哪位同學(xué),發(fā)現(xiàn)其中有誤,歡迎指正!我的微信號(hào)為:Alfred-kai。?

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

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

相關(guān)文章

  • webpack2 示例:Scope Hoisting 和 Code Splitting

    摘要:原文鏈接譯者這個(gè)示例演示了與代碼拆分相結(jié)合的。這是示例的依賴圖實(shí)線表示同步導(dǎo)入,虛線表示異步導(dǎo)入除之外的所有模塊都是模塊。為了避免沖突,模塊中的模塊連接標(biāo)識(shí)符被重命名,并簡(jiǎn)化了內(nèi)部導(dǎo)入。根模塊的外部導(dǎo)入和導(dǎo)出使用現(xiàn)有的結(jié)構(gòu)。 原文鏈接:https://github.com/webpack/we...譯者:@justjavac 這個(gè)示例演示了與代碼拆分相結(jié)合的 Scope Hoistin...

    chunquedong 評(píng)論0 收藏0
  • 10個(gè)JavaScript難點(diǎn)

    摘要:每個(gè)構(gòu)造函數(shù)都有一個(gè)屬性,用于設(shè)置所有實(shí)例對(duì)象需要共享的屬性和方法。憑直覺(jué),函數(shù)重載可以通過(guò)或者實(shí)現(xiàn),這就不去管它了。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。 譯者按:能夠讀懂這篇博客的JavaScript開(kāi)發(fā)者,運(yùn)氣不會(huì)太差... 原文: 10 JavaScript concepts every Node.js programmer must ...

    anquan 評(píng)論0 收藏0
  • 10個(gè)JavaScript難點(diǎn)

    摘要:每個(gè)構(gòu)造函數(shù)都有一個(gè)屬性,用于設(shè)置所有實(shí)例對(duì)象需要共享的屬性和方法。函數(shù)重載所謂函數(shù)重載,就是函數(shù)名稱一樣,但是輸入輸出不一樣。憑直覺(jué),函數(shù)重載可以通過(guò)或者實(shí)現(xiàn),這就不去管它了。 10個(gè)JavaScript難點(diǎn) 1.立即執(zhí)行函數(shù) 立即執(zhí)行函數(shù),即Immediately Invoked Function Expression (IIFE),正如它的名字,就是創(chuàng)建函數(shù)的同時(shí)立即執(zhí)行。它沒(méi)有...

    nidaye 評(píng)論0 收藏0
  • 【前端工程師手冊(cè)】JavaScript作用域

    摘要:函數(shù)作用域和塊作用域前面講了是詞法作用域,那么什么時(shí)候會(huì)創(chuàng)建作用域呢主要是基于函數(shù)級(jí)別的作用域,也就是每一個(gè)函數(shù)都會(huì)創(chuàng)建一個(gè)作用域。函數(shù)會(huì)被當(dāng)作函數(shù)表達(dá)式而不是一個(gè)標(biāo)準(zhǔn)的函數(shù)聲明來(lái)處理。 什么是作用域 來(lái)一段《你不知道的JavaScript-上卷》中的原話: 幾乎所有編程語(yǔ)言最基本的功能之一,就是能夠儲(chǔ)存變量當(dāng)中的值,并且能在之后對(duì)這個(gè) 值進(jìn)行訪問(wèn)或修改,這些變量住在哪里?換句話說(shuō),它...

    Paul_King 評(píng)論0 收藏0
  • 談?wù)凧avaScript的詞法環(huán)境和閉包(一)

    摘要:換句話說(shuō),定義在閉包中的函數(shù)可以記憶它被創(chuàng)建時(shí)候的環(huán)境。詞法環(huán)境的概念定義摘自百科。一個(gè)詞法環(huán)境由一個(gè)環(huán)境記錄項(xiàng)和可能為空的外部詞法環(huán)境引用構(gòu)成。中使用詞法環(huán)境管理靜態(tài)作用域。 一個(gè)資深的同事在我出發(fā)去面試前告誡我,問(wèn)JS知識(shí)點(diǎn)的時(shí)候千萬(wàn)別主動(dòng)提閉包,它就是一個(gè)坑??!坑??!??! 閉包確實(shí)是js的難點(diǎn)和重點(diǎn),其實(shí)也沒(méi)那么可怕,關(guān)鍵是機(jī)制的理解,可以和函數(shù)一起單獨(dú)拿出來(lái)說(shuō)說(shuō),其實(shí)關(guān)于閉包的...

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

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

0條評(píng)論

閱讀需要支付1元查看
<