js變數提公升

2021-09-09 07:09:38 字數 1851 閱讀 4978

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會上公升到函式頂部,但是此時f1undefined,所以執行報錯。但對於函式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...