概述
概述:ES5及以前版本的JavaScript采用var 声明变量,且不支持块级作用域。在javascript中,变量实际创建的值取决于如何声明该变量,ES6中新增了两个关键字let和const
let
基本用法:
- for循环的计数器很适合使用let
for(var i=0;i<10;i++){
console.log(i)
}
console.log(i)
和
for(let i=0;i<10;i++){
console.log(i)
}
console.log(i)
上面运行的结果是一样的,这个是没有疑问的。
再看看下一个例子:
var a=[]
for(var i=0;i<10;i++){
a[i] = function(){
console.log(i)
}
}
a[6]()
//10
和
var a=[]
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i)
}
}
a[6]()
//6
以上两段代码只是将keyword var 变成了 let 为什么运行之后结果和预想的不一样呢。
因为这里的let是针对块级作用域的,它的作用范围只有for循环当中,所以你针对for循环里面的每个 i 赋函数,就会给数组a里面的每个元素赋值。而在使用var的时候,使用var定义的 i 是全局变量,意思就是a[i] = function(){}里面的 i 已经不是for循环定义的 i
var a=[]
for(var i=0;i<10;i++){
let j = i
console.log(j)
a[i] = function(){
console.log("这里的j"+j+"---"+"i"+i)
}
}
a[6]()
你会发现,这里的J是按顺序输出的,但是i的值一直为10,说明赋值语句中的i不同于我们想要按顺序输出的i,在赋值进行之前我们的i已经变成了10,因为JS是异步的,所以它在对数组元素赋函数值的之前,i累加已经结束了,因为他是全局变量,所以这个时候i的值已经变成了10。
所以在使用let关键字之后会比使用var更加准确方便。
变量提升:
console.log(i) //结果为 undefined
var i= 0
上面的代码就相当于
var i;
console.log(i)
i = 0
var声明所有的变量无论其声明位置在何处,都会被是为声明于所在函数或全局的顶部。这就是变量提升。
但是let不支持变量提升,所以let定义的变量必须先声明再使用。且不能使用let重复声明
const
const 和 let 关键字都是属于块级作用域范畴的,但是const和let不一样,const声明的一个只读的常量,一旦声明,其值不能改变且必须立即初始化。
**特例:**当使用const声明的常量不是一个值,而是一个地址时,该常量所引用的对象或数组是可以更改成员的,只是不能更改该常量保存的地址
顶层对象
浏览器的顶层对象是window, Node的为global。
var 定义的变量会关联到顶层对象中,意思是我们使用var定义的变量可以在浏览器中通过 window.xx 来访问到定义的变量。
但是使用let或者const定义的变量是无法通过window.xx 来访问的。
作用域
全局作用域:在所有函数之外定义的变量拥有全局作用域,该变量为全局变量。
函数作用域: 在函数中声明(包括函数参数)指定在其所声明的函数内被访问。
块作用域:由 { } 界定的代码区域,let 声明的变量具备可访问块作用域。
作用域链
每一段javascript代码(全局代码或函数)都有一个与之相关联的作用域链。
当javascript查找变量 X 的时候,会从当前作用域开始跟随作用域链向上查找,直到找到 X 的声明,若到达全局作用域中仍未找到,则抛出一个引用错误异常(ReferenceError)
最后
以上就是魔幻黑猫为你收集整理的学习ES6(一):作用域、const和let的全部内容,希望文章能够帮你解决学习ES6(一):作用域、const和let所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复