es6語法
阿新 • • 發佈:2018-05-22
gif () 泄露 提升 splay sig def mil uncaught 和
一、 let
1、es6新增了let命令,用來聲明變量。它的用法類似於var,但是所聲明的變量,只在let命令所在的代碼塊內有效。
<script> { var a = 10; var a = 20; } console.log(a); // 20 { let b = 10; console.log(b) // 10 } console.log(b) // Uncaught ReferenceError: b is not defined </script>
上面代碼在代碼塊之中,分別用let
var
聲明了兩個變量。然後在代碼塊之外調用這兩個變量,結果let
聲明的變量報錯,var
聲明的變量返回了正確的值。這表明,let
聲明的變量只在它所在的代碼塊有效
var a = []; for(var i = 0; i < 10; i++){ a[i] = function () { console.log(i); }; } a[5]() // 10
// ******************************
var b = []; for(let i = 0; i < 10; i++){ b[i] = function () { console.log(i); }; } b[5]() // 5
2、不允許重復聲明
let不允許在相同作用域內,重復聲明同一個變量。
function func() { let a = 10; var a = 1; return a; } console.log(func()); // Uncaught SyntaxError: Identifier ‘a‘ has already been declared
// ******************************
function func() { let a = 10; let a = 1; return a; } console.log(func());// Uncaught SyntaxError: Identifier ‘a‘ has already been declared
function func(arg) { let arg; // 報錯 } function func(arg) { { let arg; // 不報錯 } }不能在函數內部重新聲明參數
3、為什麽需要塊級作用域
3.1、內層變量可能會覆蓋外層變量
var a = 10; function func(){ console.log(a) var a = 5; } func() //undefined
上面代碼原因在於變量提升,導致內層的a
變量覆蓋了外層的a
變量。
3.2、用來計數的循環變量泄露為全局變量
var s = ‘hello‘; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代碼中,變量i
只用來控制循環,但是循環結束後,它並沒有消失,泄露成了全局變量。
二、const
const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。
const PI = 3.1415926; PI // 3.1415926 PI = 3; // TypeError: Assignment to constant variable.
const聲明的變量不得改變值,這意味著,const
一旦聲明變量,就必須立即初始化,不能留到以後賦值
const foo; // SyntaxError: Missing initializer in const declaration // 對於const來說,只聲明不賦值,就會報錯
const的作用域與let
命令相同:只在聲明所在的塊級作用域內有效。
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
es6語法