函數(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)解釋一下。
- 我們?cè)诤瘮?shù)外面聲明了變量
variable,由于函數(shù)內(nèi)部也通過(guò)var聲明了同名變量。所以外部的全局變量被局部變量覆蓋掉了。之所以這里是undefined是由于var聲明被提前了。 - 這里
variable也是undefined是由于,我們?cè)?處已經(jīng)聲明了變量。兩者直接并沒(méi)有任何的副作用語(yǔ)句,所以它現(xiàn)在的值依然是undefined。 - 由于打印之前對(duì)變量進(jìn)行賦值操作。所以現(xiàn)在變量的值是
Happy Coding。
這個(gè)例子很好證明了:
使用var的話(huà)只有變量聲明提前了--變量初始化代碼仍然在原來(lái)的位置。