ES6学习笔记(1)块级作用域与函数作用域

并没有使用let跟const来作为他的标题。

因为实际上来说let跟const所做的事情就是创建块级作用域。

为什么这样认为呢?

因为let的一个变量影响的并不是这个一个变量,而是整个作用域,实际上是对整个作用域进行了改造。

而在es6之前,其实js是只有函数作用域的,也就是说一个函数创建一个作用域而不是一个{}创建一个作用域,这个的结果就是会导致一些结果

内层变量会覆盖外层变量

用来计数的循环变量会泄漏为全局变量

其本质的原因就是因为{}不会创建单独的作用域,所以{}里外其实是一个层级。

而块级作用域就是

一个{}就是一个独立的作用域

不会有变量提升

不会挂载在window对象上

这个几个特点,而块级作用域的创建,就是通过let跟const来进行创建

这样我们就可以去理解一些东西了。

比如

console.log(a)

var a=10;

这个是正确的

而把var a=10改成 let a=10;

之后,因为形成了块级作用域,所以导致报错,这个也就是 暂时性死区

其原因是因为块级作用域没有变量提升。

也就是说,不能在声明前对let变量进行操作

这个规定主要是为了减少运行时的错误,防止变量声明钱就被使用。总之,暂时性死区的本质就是,只要一进入当前作用域,索要使用的变量就已经存在,但是不可以被获取,只有当声明变量的哪一行代码出现,才可以获取和使用该变量。

一个很典型的使用块级作用域的例子就是循环赋值函数

var a=[]

for var i=0 i<length i++

a[i]=func clg i

最后每个a[i]()其实都是clg length-1

这个的原因在于

i其实是挂载在window上面的

如果我们写一个函数

function(){clg i}

会怎么样呢?

最后肯定是clg window.i

如果在全局下的话,也就是说clg i的本质是clg window.i,或者说是 clg this.i this为window

也就是说每个a[i]的函数都是 clg window.i




猜你喜欢

转载自blog.csdn.net/aboyl/article/details/78995130