变量、作用域、内存---part5

235 阅读2分钟

我们上一部分简单的提到了作用域的概念,在一个函数被解析的时候会在作用域的范围中产生一个环境变量的对象,函数的所有的取值和赋值的操作都在这个环境变量中去操作

我们先定义一个函数里面声明一个变量叫outerValue再在函数的里面再创建一个函数调用该变量

我们在全局尝试获取到函数里面的变量程序的解析立马会报错
那么我们先问一个终极的问题,为什么要有作用域的区分?大家不管在那个作用域里面随意调用不美滋滋么?其实我的理解是,作用域成功的把js的编程模式编程了“面向对象”的黑盒模式,别人看到你的代码里面封装好的一个函数,只需要管它的入参是什么,它的输出是什么,剩下的关于这个函数是怎么被设计的不用管,拿来用就好,其实现实世界也是这样的,我现在用的笔记本,我只管学会在键盘上码字,不用了解CPU是怎么处理我触发的动作的过程
JS作用域的特点和其他的编程语言大有不一样,JS作用域里面没有块级作用域

for循环里面并没有形成一个独立的块级作用域,所以我们在for循环的外面照样能把for循环里面的变量打印出来
JS虽然没有块级作用域,但是我们可以利用js独特的作用域链的概念用函数模拟块级作用域

但是我们再新的语法(也不是很新)ES6中产生了块级作用域的限制,ES6产生了let和const两个特殊的声明变量的方式,与var这种声明变量的方式最大的不同是,var可以变量的声明提升而let和const没有变量的声明提升,等等!!!声明提升又是啥??

注意看这两行代码我们在第一行的时候调用了在第二行才用var去声明出来的i变量但是我们代码解析并没有报错,而是爆出了undefined!!!!这是因为由于我们js没有块级作用域的原因我们所有的变量声明都会被提到一切程序解析的最前面

也就是我们其实代码解析的顺序对于浏览器来说是这个样子滴~,但是自从有了ES6里面的let和const就有了块级作用域,这样的变量提升就没有了

我们照样用这样的顺序去写代码但是报错了,错误的原因翻译过来是“无法获取到J,请先初始化”