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 letii 
// ,
//

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コマンドが するグローバル は、 として オブジェクトのプロパティです. 、letconstclass で されるグローバル は、 オブジェクトの に さない
    ブラウザ ではwindowオブジェクト、ノードではglobalオブジェクトを す オブジェクト

    :https://www.cnblogs.com/avidya/p/10595588.html