ES6语法(2)
let&const
let&const 共同点:
(1) 不允许重复声明变量
(2) 没有变量提升(其实在执行上下文阶段被创建出来了,但是不能被访问,从而达到没有变量提升的效果)
(3) 设置块级作用域(变量,方法只能在块级作用域内部访问,不能在外部访问)
(4) 形成暂时性死区(在块级作用域中,即使外层区域声明过该变量,只要在块级作用域内用let/const声明同名变量,就无法提前访问,此时该块级作用域称为暂时性死区)let&const 不同点:
(1) const一般用来声明一个常量,不允许修改,而let是可以多次修改变量值的
(2) const声明变量必须有默认赋值,let可以没有默认赋值
(3) 如果const声明的是一个引用类型,那么只要不是修改指针地址,而是修改引用类型内部的数据,是可以的,修改引用类型的指针地址是不允许的
let&const与window的关系
- 前提: 最新的ECMA标准中,没有VO(变量对象)的概念,取而代之的是VE(变量环境)
每一个执行上下文会关联到变量环境(VE)中,在执行代码中变量和函数的声明会作为环境记录(ER)添加到变量环境中,对于函数来说,参数也会被作为环境记录添加到变量环境中 - 关系: let和const不会再window对象上添加任何属性,而var声明的变量会在window对象上同步添加,let 和const 的声明的变量保存到VariableMap中,通过HashMap的形式进行存储和查找
块级作用域补充
部分浏览器为了兼容以前的代码,在块级作用域内,用function直接声明的函数是不受块级作用域限制的,在外部仍然可以访问
/* var和function声明的变量和方法都可以在块级作用域外访问 */ { let a = 1 var b = 2 function add(){ console.log(a) } } console.log(a) --> 报错,提示找不到变量a add() --> 1 console.log(b) --> 2
if/switch/for
这些都是块级作用域(不针对var和function声明的变量和方法)
用 let for循环 示意代码
for( let i = 0 ; i<3 ; i++ ){
console.log( i )
}
相当于:
{
let i = 0;
console.log( i ) --> 0
i++
}
{
let i = 1
console.log( i ) --> 1
i++
}
{
let i = 2
console.log( i ) --> 2
i++
}
注意: 这里不能使用const 进行for循环,因为有对原来值进行修改的操作(i++)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!