let声明
- Es6中引入块级声明,
let
声明的变量作用域限制在代码块中;
-
let
声明不会被提升;
- 在同一作用域中不能用
let
重复定义已经存在的标识符,会抛出错误。
const声明
-
const
声明的变量作用域也会限制在代码块中;
-
const
声明的是常量,其值一旦被设定后不可更改,每个通过const声明的常量必须进行初始化(赋值)
-
const
声明不允许修改绑定,但允许修改值;例如const
声明对象,对象的值是可以修改的
临时死区的存在
- 临时死区(temporal dead zone)TDZ用来描述
let
和const
的不提升效果;
- 与
var
声明不同,let
和const
声明的变量不会被提升到作用域的顶部,在javascript
引擎扫描代码的时候会将let
和const
的声明放到临时死区中
循环中的块级作用域
var funcs = [];
for(var i=0;i<10;i++) {
funcs.push(function() {
console.log(i);
})
}
funcs.forEach(funcion(func) {
func(); //输出10次10
})
var funcs = [];
for(var i=0;i<10;i++) {
funcs.push((function(value){
// 变量i的值在传递到这个作用域是被赋值给了value;
// 此时这个值就不会随外部变量而变化了;
return function() {
console.log(value);
}
})(i));
}
funcs.forEach(function(func) {
func(); //输出0,然后是1,2直到9
})
var funcs=[];
for(let i=0;i<10;i++) {
funcs.push(function() {
console.log(i);
})
}
funcs.forEach(function(func) {
func(); //输出0,然后是1,2直到9
})
全局作用域的绑定
- 当
var
被用于全局作用域时,它会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)的属性
- 当在全局作用域中使用
let
和const
,会在全局作用域下创建一个新的绑定,但是该绑定不会添加为全局对象的属性。
网友评论