关于javascript:let和const命令

2次阅读

共计 1603 个字符,预计需要花费 5 分钟才能阅读完成。

let 和 const 命令

1.let 命令

  • 根本用法

    let 用来申明变量,它所申明的变量,只在 let 命令所在的代码块内无效。

{
    var a = 1;
    let b = 1;
}
a  //1
b  //ReferenceError: b is not defined
  • 不存在变量晋升

    let 申明的变量肯定要在申明后应用。

// var 的状况
console.log(foo); // 输入 undefined
var foo = 2;

// let 的状况
console.log(bar); // 报错 ReferenceError
let bar = 2;
  • 暂时性死区(temporal dead zone,简称 TDZ)

    只有块级作用域内存在 let 命令,它所申明的变量就“绑定”(binding)这个区域,不再受内部的影响。

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
  • 不容许反复申明

    let 不容许在雷同作用域内,反复申明同一个变量。

2. 块级作用域

  • 为什么须要块级作用域?

    1. 内层变量可能会笼罩外层变量

    let a = 1;
    function f() {consoel.log(a);
        if(false) {var a = 2;}
    }
    f();  //undefined

    2. 用来计数的循环变量泄露为全局变量

    var s = 5;
    
    for(var i = 0;i < s; i++){//dosomething...}
    
    console.log(i);  // 5
  • ES6 的块级作用域

    1. 外层代码块不受内层代码块的影响

    2.ES6 容许块级作用域的任意嵌套

    3. 内层作用域能够定义外层作用域的同盟变量

  • 块级作用域与函数申明

    1.ES5 规定,函数只能在顶层作用域和函数作用域之中申明,不能在块级作用域申明。

    2. 然而,浏览器没有恪守这个规定

    3.ES6 引入了块级作用域,明确容许在块级作用域之中申明函数。

//es5 环境
function f() { console.log('I am outside!'); }

(function () {if (false) {
    // 反复申明一次函数 f
    function f() { console.log('I am inside!'); }
  }

  f();  // I am inside!}());
//es6 环境
function f() { console.log('I am outside!'); }

(function () {if (false) {
    // 反复申明一次函数 f
    function f() { console.log('I am inside!'); }
  }

  f();  // Uncaught TypeError: f is not a function}());

3.const 命令

  • 根本用法

    1.const 申明一个只读的常量,一旦申明,常量的值就不能扭转

    2. 这意味着,const 一旦申明变量,就必须立刻初始化,不能留到当前赋值。

    const foo;
    // SyntaxError: Missing initializer in const declaration

    3.const 命令和 let 命令相同点:

    a. 只在申明所在的块级作用域内无效
    
    b. 申明的值不晋升,同样存在暂时性死区
    
    c. 不可反复申明
    
  • 实质

    1.const 实际上保障的,是变量指向的内存地址所保留的数据不得改变。

    2. 对应复合类型的数据,const 只能保障这个指针是固定的,不能管制它指向的数据结构是不是可变的。

  • ES6 申明变量的六种办法

    1.ES5:var 命令 和 function 命令

    2.ES6:let,const,import,class

4. 顶层对象的属性

a. 顶层对象,在浏览器环境指的是 window 对象,在 Node 指的是 global 对象。b.es5 中,顶层对象的属性与全局变量是等价的。c.es6 中,let 命令、const 命令、class 命令申明的全局变量,不属于顶层对象的是属性。

5.globalThis 对象

ES2020 在语言规范的层面,引入 globalThis 作为顶层对象。也就是说,任何环境下,globalThis 都能够指向全局环境下的 this。
正文完
 0