Javascript 聲明提前

函數(shù)定義語(yǔ)句中函數(shù)被顯式地"提前"到了腳本或函數(shù)地頂部。因此它們?cè)谡麄€(gè)腳本和函數(shù)內(nèi)部都是可見(jiàn)的。使用var地話(huà)只有變量聲明提前了--變量初始化代碼仍然在原來(lái)地位置。

函數(shù)定義被提前

在腳本里和函數(shù)內(nèi)部無(wú)論在哪個(gè)地方定義了函數(shù),其他地方都能夠訪(fǎng)問(wèn)。當(dāng)然,可以舉個(gè)例子說(shuō)明。我們定義一個(gè)長(zhǎng)函數(shù):

> result = function() {
...     var b = a;
...     b();
...     function a() {
.....         console.log("I am a!!");
.....     }
... }
[Function]
> result()
I am a!!

例子說(shuō)明了這句話(huà):

函數(shù)定義語(yǔ)句中函數(shù)被顯式地"提前"到了腳本或函數(shù)地頂部。因此它們?cè)谡麄€(gè)腳本和函數(shù)內(nèi)部都是可見(jiàn)的。

上面例子中函數(shù)a在變量b后面被定義。但是我們函數(shù)體內(nèi)第一句話(huà)就已經(jīng)吧函數(shù)a賦值給b;并在第2句話(huà)調(diào)用函數(shù)b。如果函數(shù)的定義沒(méi)有被提前的話(huà)這樣來(lái)說(shuō)應(yīng)該會(huì)報(bào)錯(cuò)才對(duì)。事實(shí)上并沒(méi)有報(bào)錯(cuò)。證明了函數(shù)定義會(huì)被提前到函數(shù)的頂部。腳本級(jí)別的函數(shù)也是如此。這里不冗余了。

變量聲明被提前

這里變量聲明被提前相對(duì)于函數(shù)定義被提前又稍微復(fù)雜一點(diǎn)。因?yàn)樽兞康囊?guī)則是 使用var地話(huà)只有變量聲明提前了--變量初始化代碼仍然在原來(lái)地位置。。這個(gè)其實(shí)也很好證明。我們?cè)趎ode里面定義一個(gè)函數(shù)。

> var variable = "Hello World";
undefined
> function testVariable() {
...     console.log(variable);
...     var variable;
...     console.log(variable);
...     variable = "Happy Coding";
...     console.log(variable);
... }
undefined

然后調(diào)用這個(gè)函數(shù):

> testVariable()
undefined
undefined
Happy Coding

得到了很夢(mèng)幻的結(jié)果。容小弟來(lái)解釋一下。

  1. 我們?cè)诤瘮?shù)外面聲明了變量variable,由于函數(shù)內(nèi)部也通過(guò)var聲明了同名變量。所以外部的全局變量被局部變量覆蓋掉了。之所以這里是undefined是由于var聲明被提前了。
  2. 這里variable也是undefined是由于,我們?cè)?處已經(jīng)聲明了變量。兩者直接并沒(méi)有任何的副作用語(yǔ)句,所以它現(xiàn)在的值依然是undefined。
  3. 由于打印之前對(duì)變量進(jìn)行賦值操作。所以現(xiàn)在變量的值是Happy Coding。

這個(gè)例子很好證明了:

使用var的話(huà)只有變量聲明提前了--變量初始化代碼仍然在原來(lái)的位置。

Happy Coding _

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容