1.let
1.let只是在代码块内有效
{
let a =1;
var b =2;
}
a//报错
b//2
2.for循环用let比较好,var会造成外部作用域污染
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10 把var改成let才能输出6
3.for循环的()为{}的父作用域
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
for (let i = 0; i < 3; i++) {
console.log(i);
}
// 0
// 1
// 2
2.块级作用域
1.任意嵌套,内层作用域可以定义外层作用域的同名变量
function f1(){let i=1;{let i =2;return i} return i}
f1()
//2
2.避免在块级作用域内声明函数,如果确实需要,也应该写成函数表达式,而不是函数声明语句。
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
3.const
const声明一个只读的常量。一旦声明,常量的值就不能改变。
将一个对象声明为常量必须非常小心
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
4.顶层对象的属性
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined