var a =
100;
functionf(
) console.
log(a);}
f()// undefined
// 200
var a =
100;
functionf(
)}f(
);console.
log(a)
;// 100
如果你習慣了強型別語言的程式設計方式,那麼看到上述輸出結果你肯定會大吃一驚。
我們來看一下c++
的乙個例子:
#include using namespace std;
int main()
cout << x << endl;
return 0;
}
再來看乙個js
的例子:
var a =
100;
console.
log(a);if
(true
)console.
log(a)
;// 100
// 200
// 200
if
**塊中的變數覆蓋了全域性變數。那是因為js
只有全域性作用域和函式作用域,沒有塊作用域。塊內的變數x
影響到了全域性變數x
。
functionf(
)())
;}console.
log(x);}
// 100
// 200
// 100
其本質上利用了js
的函式作用域來模擬實現塊級作用域。
在js
中,變數進入乙個作用域有以下方式:
在**執行前,函式宣告和變數定義通常會被直譯器移動到其所在作用域的最頂部。如下:
functionf(
)
上面**被直譯器解釋後,將會變成如下形式:
functionf(
)
hoisting
只是將變數的定義上公升,但變數的賦值並不會上公升。
再來看乙個例子:
functionf(
);functionf2(
)}f(
);// typeerror: f1 is not a function
// normal
首先var f1
會上公升到函式頂部,但是此時f1
為undefined
,所以執行報錯。但對於函式f2
,函式本身也是一種變數,存在變數上公升的現象,也會上公升到函式頂部,所以f2()
能順利進行。
例1等同於如下**:
var a =
100;
functionf(
) console.
log(a);}
f()// undefined
// 200
例2等同於如下**:
var a =
100;
functionf(
) a =
200;
return;}
f();
console.
log(a)
;// 100
參考自: js變數提公升
在了解變數提公升之前,應該先了解一下js到底是一種什麼型別的語言,他的執行機制又是怎樣的.console.log global undefined var global global console.log global global function fn fn 可以看出來 變數提公升只是將變數提...
JS變數提公升
在當前作用域中,js 自上而下執行之前,瀏覽器首先會把所有的帶var function關鍵字的進行提前宣告 定義。注意宣告和定義的區別 宣告 declare var num 在當前作用域中吼一嗓子我有num這個名字了。定義 define num 12 把宣告的名字賦值。console.log a u...
js變數提公升
function say say 在js中,瀏覽器在執行 前會有一次預編譯,這個過程會把函式宣告和變數宣告提公升到作用域的頂端,並賦值undefind,這個過程就叫提公升 並且在js中,函式是一等公民,優先順序是最高的,稍後會解釋 這就不難理解剛才那道題了,上面的 編譯後如下 function sa...