學習資料:ecmascript 6 入門
如果使用var,只有乙個全域性變數i:
var a = ;
for (var i = 0; i < 10; i++) ;
}a[6](); // 10
var a = ;
for (let i = 0; i < 10; i++) ;
}a[6](); // 6
設定迴圈變數的那部分是乙個父作用域,而迴圈體內部是乙個單獨的子作用域:
for (let i = 0; i < 3; i++)
// abc
// abc
// abc
let所宣告的變數一定要在宣告後使用:
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let 的情況
console.log(bar); // 報錯referenceerror
let bar = 2;
只要塊級作用域內存在let命令,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響。所以需要先宣告再使用:
var tmp = 123;
if (true)
if (true)
隱蔽的死區:
function bar(x = y, y = 2)
bar(); // 報錯
let不允許在相同作用域內,重複宣告同乙個變數。
// 報錯
function func()
// 報錯
function func()
function func(arg)
function func(arg)
}
es5中沒有塊級作用域,內層變數可能會覆蓋外層變數:
var tmp = new date();
function f()
}f(); // undefined
es5中沒有塊級作用域,用來計數的迴圈變數洩露為全域性變數:
var s = 'hello';
for (var i = 0; i < s.length; i++)
console.log(i); // 5
es6 規定,塊級作用域之中,函式宣告語句的行為類似於let,在塊級作用域之外不可引用。但在瀏覽器的 es6 環境中,塊級作用域內宣告的函式,行為類似於var宣告的變數。
// 瀏覽器的 es6 環境
function f()
(function ()
}f();
}());
// uncaught typeerror: f is not a function
考慮到環境導致的行為差異太大,應該避免在塊級作用域內宣告函式。如果確實需要,也應該寫成函式表示式,而不是函式宣告語句。
// 函式宣告語句
}// 函式表示式
;}
es6 的塊級作用域允許宣告函式的規則,只在使用大括號的情況下成立,如果沒有使用大括號,就會報錯。
// 不報錯
'use strict';
if (true)
}// 報錯
'use strict';
if (true)
function f() {}
const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。
const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
與let類似,只在宣告所在的塊級作用域內有效。宣告的常量也是不提公升,同樣存在暫時性死區,只能在宣告的位置後面使用。不可重複宣告。
const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體位址不得改動。
如果真的想將物件凍結,應該使用object.freeze方法。
const foo = object.freeze({});
// 常規模式時,下面一行不起作用;
// 嚴格模式時,該行會報錯
foo.prop = 123;
除了將物件本身凍結,物件的屬性也應該凍結。下面是乙個將物件徹底凍結的函式。
var constantize = (obj) =>
});};
var命令和function命令宣告的全域性變數,依舊是頂層物件的屬性;另一方面規定,let命令、const命令、class命令宣告的全域性變數,不屬於頂層物件的屬性。
墊片庫system.global可以在所有環境拿到global。
// commonjs 的寫法
var global = require('system.global')();
// es6 模組的寫法
import getglobal from 'system.global';
const global = getglobal();
es6學習筆記 let和const
console.log b uncaught referenceerror a is not defined 在for迴圈中,迴圈語句部分是乙個作用域,內部又是乙個作用域 for let a 1 a 3 a 在let宣告變數完成前,對變數賦值會出錯es中模仿塊級作用域 function functi...
ES6學習筆記 let和const
今天開始讀阮一峰的 ecmascript 6 入門 在這裡記錄下閱讀過程中的要點,以便隨時查閱。頂層物件的屬性與全域性變數掛鉤,被認為是js最大的敗筆之一,es6開始,全域性變數將逐步與頂層物件脫鉤。為了保持相容性,一方面,var和function宣告的全域性變數,依舊是頂層物件的屬性 另一方面,l...
ES6學習筆記之《let 和 const》
es6宣告變數的方法 var function let const import class let和 const const的作用域與let命令相同 只在宣告所在的塊級作用域內有效。if true max uncaught referenceerror max is not defined con...