Es 6-変数を宣言する方法は6種類あります(var,function,let,const,class,import)
4033 ワード
var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
let
声明的变量只在它所在的代码块有效。- 不存在变量提升
let
不允许在相同作用域内,重复声明同一个变量- 暂时性死区,只要块级作用域内存在
let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响, 定义之前不能使用。 - 应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
for
循环的计数器,就很合适使用let
命令。
for (let i = 0; i < 10; i++) {let i = 'abc';}
// i
let
, i
, i
// ,
// :
if (true) {
// TDZ
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
const
み り を します. されると、 の は に できません.- リフト
は しない.- letは、 じ ドメイン で じ
を り し することを さない.-
const
を すると、すぐに する があり、 で を り てることはできません.- は、 されたブロックレベルの ドメイン でのみ です.
- デッドゾーン
が する.const, ,
, 。 , 。
// :
const foo = Object.freeze({});
// ,
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
var
コマンドとfunction
コマンドが するグローバル は、 として オブジェクトのプロパティです. 、let
、const
、class
で されるグローバル は、 オブジェクトの に さない
ブラウザ ではwindow
オブジェクト、ノードではglobal
オブジェクトを す オブジェクト
:https://www.cnblogs.com/avidya/p/10595588.html