高階js 變數提公升以及自由變數

2022-09-03 18:33:09 字數 1916 閱讀 7347

q首先一道題

if(false

)console.log(a);

//undefined

//我以為輸出referenceerror: aa is not defined

//但是實際輸出undefined

//因為js沒有塊級作用域,所以最後**就成了這樣

vara;

if(false

)console.log(a);

《1》  let和const宣告的變數只在let命令所在的**塊內有效

在**塊外引用let和const宣告的變數 無效

//

referenceerror: i is not defined

《2》constlet命令改變了語法行為,它所宣告的變數一定要在宣告後使用

原因是存在暫死區

if (true

)

《3》不允許重複宣告,同一塊級作用域中

《4》const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變

這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。

對於const來說,只宣告不賦值,就會報錯。
es5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景

第一種場景,內層變數可能會覆蓋外層變數。

第二種場景,用來計數的迴圈變數洩露為全域性變數

《1》es5 規定,函式只能在頂層作用域和函式作用域之中宣告,不能在塊級作用域宣告。

瀏覽器沒有遵守這個規定,為了相容以前的舊**,還是支援在塊級作用域之中宣告函式

《2》es6 引入了塊級作用域,明確允許在塊級作用域之中宣告函式。es6 規定,塊級作用域之中,函式宣告語句的行為類似於let,在塊級作用域之外不可引用。

三條規則只對 es6 的瀏覽器實現有效,其他環境的實現不用遵守,還是將塊級作用域的函式宣告當作let處理

//

瀏覽器的 es6 環境

function f()

(function

() }

f();

}());

//uncaught typeerror: f is not a function

//

es5 環境

function f()

(function

()

if (false

) f();

}());

//i am inside!

//es6 環境

function f()

(function

()

if (false

) f();

}());

//i am outside!

var a = 1;      

function

b()

}

b();

alert(a);

//1;

//實際

var a = 1;

function

b()

}

b();

alert(a);

js變數提公升

在了解變數提公升之前,應該先了解一下js到底是一種什麼型別的語言,他的執行機制又是怎樣的.console.log global undefined var global global console.log global global function fn fn 可以看出來 變數提公升只是將變數提...

js變數提公升

var a 100 functionf console.log a f undefined 200var a 100 functionf f console.log a 100如果你習慣了強型別語言的程式設計方式,那麼看到上述輸出結果你肯定會大吃一驚。我們來看一下c 的乙個例子 include us...

JS變數提公升

在當前作用域中,js 自上而下執行之前,瀏覽器首先會把所有的帶var function關鍵字的進行提前宣告 定義。注意宣告和定義的區別 宣告 declare var num 在當前作用域中吼一嗓子我有num這個名字了。定義 define num 12 把宣告的名字賦值。console.log a u...