学习ES6(一):作用域、const和let

10 篇文章 0 订阅
1 篇文章 0 订阅

概述:ES5及以前版本的JavaScript采用var 声明变量,且不支持块级作用域。在javascript中,变量实际创建的值取决于如何声明该变量,ES6中新增了两个关键字letconst

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值