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...