目录
1.什么是作用域?
作用域是指代码能有效执行的范围,它可以提高程序的可靠性并减少命名冲突。
其分为全局作用域和局部作用域两个部分,常见的全局作用域即在js标签内书写的内容和在js文件中书写的内容,局部作用域即在函数内部编写的内容。
注意:函数中通过var声明变量,但已经赋值的变量作用域在全局,也就是说,整体的文件这个变量的值都是你赋值的内容。通过下图代码应该可以理解这个意思。
这个sum并没有通过var sum的方式提前定义,而是在函数fn内直接给他赋值为10,但此函数前后输出的sum的值都为10。但是,此种情况只适用于为通过表达式定义的函数,如函数定义如下图则会报错。
其实造成这个结果的主要原因还是在于下文提到的预解析机制。看了就懂了。
2.全局作用域和局部作用域的效率问题
全局作用域的内容在浏览器关闭的时候被删除,而局部变量的内容在相关代码执行完毕后便会销毁,占用的内存相对较少。
3.作用域链
内部函数在查找外部函数变量时采用链式结构,简单来说就是就近原则,定义的变量距离哪个值更近便会采用哪个。
4.什么是预解析?
js引擎把js里面所有定义的变量var和function提到当前作用域的最前面的操作叫做预解析。
预解析分为变量预解析(变量提升)和函数预解析(函数提升),变量提升只提升定义而不会提升通过赋值构造的变量,函数提升不会提升通过表达式定义的函数,从第一点涉及到的示例应该可以分析出来。
一个实例检验知识点理解是否到位:
思考一下图中的代码结果是什么呢?
下面来解释一下这个实例。
首先,根据我们的预解析机制可以将此段代码换个顺序,如下图。
所以结果如下:
本文章中涉及的知识点参考自B站黑马程序员视频: