2. let 和 const 命令

一、let

1、let命令

用法类似于var,但是它所声明的变量,只在let命令所在的代码块内有效。
如下代码,是个大坑,因为i被认为是全局变量,输出10

var a = [];
for (var i = 0; i < 10 ; i++) {
    a[i] = function() {
        console.log(i);
    }
}

a[6]();

原因: 变量i是var命令声明的,在全局范围内都有效,所以a[i]都指向同一个对象
疑点:
1、 i为什么不是9? 测试了下,因为a[i]是个function,最后i=9时又做了++,所以是10

把var 改成let之后,就正常了,因为let让i变成了for里面的局部变量

2、 let要求先定义后使用

否则报“ ReferenceError”

3、隐蔽的误区

如下代码,因为y未被先定义

function bar(x = y, y = 2) {
  return [x, y];
}

bar(); // 报错

4、let不允许在相同作用域内,重复声明同一个变量。

5、块级作用域

二、const

1、 常量的意义:指针地址不变

const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

2、实现真的const

如果真的想将对象冻结,应该使用Object.freeze方法

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;

三、一些总结

1、 用let和const定义的变量,不再属于全局对象(window或global)

var a = 1;
console.log(window.a);

let b = 1;
console.log(window.b);

你可能感兴趣的:(2. let 和 const 命令)