函數(shù)定義語句中函數(shù)被顯式地"提前"到了腳本或函數(shù)地頂部鳞陨。因此它們在整個腳本和函數(shù)內部都是可見的。使用var地話只有變量聲明提前了--變量初始化代碼仍然在原來地位置瞻惋。
函數(shù)定義被提前
在腳本里和函數(shù)內部無論在哪個地方定義了函數(shù)厦滤,其他地方都能夠訪問。當然歼狼,可以舉個例子說明掏导。我們定義一個長函數(shù):
> result = function() {
... var b = a;
... b();
... function a() {
..... console.log("I am a!!");
..... }
... }
[Function]
> result()
I am a!!
例子說明了這句話:
函數(shù)定義語句中函數(shù)被顯式地"提前"到了腳本或函數(shù)地頂部。因此它們在整個腳本和函數(shù)內部都是可見的羽峰。
上面例子中函數(shù)a
在變量b
后面被定義趟咆。但是我們函數(shù)體內第一句話就已經(jīng)吧函數(shù)a
賦值給b
;并在第2句話調用函數(shù)b
添瓷。如果函數(shù)的定義沒有被提前的話這樣來說應該會報錯才對。事實上并沒有報錯值纱。證明了函數(shù)定義會被提前到函數(shù)的頂部鳞贷。腳本級別的函數(shù)也是如此。這里不冗余了虐唠。
變量聲明被提前
這里變量聲明被提前相對于函數(shù)定義被提前又稍微復雜一點搀愧。因為變量的規(guī)則是 使用var地話只有變量聲明提前了--變量初始化代碼仍然在原來地位置。疆偿。這個其實也很好證明咱筛。我們在node里面定義一個函數(shù)。
> var variable = "Hello World";
undefined
> function testVariable() {
... console.log(variable);
... var variable;
... console.log(variable);
... variable = "Happy Coding";
... console.log(variable);
... }
undefined
然后調用這個函數(shù):
> testVariable()
undefined
undefined
Happy Coding
得到了很夢幻的結果杆故。容小弟來解釋一下迅箩。
- 我們在函數(shù)外面聲明了變量
variable
,由于函數(shù)內部也通過var聲明了同名變量处铛。所以外部的全局變量被局部變量覆蓋掉了饲趋。之所以這里是undefined
是由于var聲明被提前了。 - 這里
variable
也是undefined
是由于罢缸,我們在1處已經(jīng)聲明了變量篙贸。兩者直接并沒有任何的副作用語句,所以它現(xiàn)在的值依然是undefined
枫疆。 - 由于打印之前對變量進行賦值操作爵川。所以現(xiàn)在變量的值是
Happy Coding
。
這個例子很好證明了:
使用var的話只有變量聲明提前了--變量初始化代碼仍然在原來的位置息楔。