在js中,作用域是最基础,最重要的东西,让我们来看看什么叫做作用域
作用域简单来讲就是对标识符的一个访问规则,什么叫做标识符呢?比如申明一个变量,var a = 2;那么2的标识符就是这个a,这个a同时也可以叫做变量名。
js中作用域分为两个部分,一个叫词法作用域,一个叫动态作用域。
词法作用域主要是由申明标识符的位置来决定的,词法作用域主要分为两种,一种叫做全局作用域,一般指的是<script>....</script>中间的这一块,另一种叫做函数作用域,比如 function a(){},这个a函数里面的东西都包裹在a函数中。全局作用域是无法访问函数作用域中的标识符,但函数作用域中的标识符,如果查找不到,会去全局作用域中查找,这种一层一层的查找关系就是作用域链。
图1 图2根据上面两张图,在图1中,如果在全局的环境中访问变量a,它的值是1,函数中的变量a重新赋值,并不会影响到全局中的变量a,图2中,在函数内部访问变量a,但函数中并没有申明过变量a,所以会顺着作用域链去查找到在全局环境中的变量a
在变量申明中,会出现变量申明提前的情况:
图3 图4在图3中,在第一行中打印没有被申明的变量a出现undefined而不是未定义,是因为变量的申明会被提前,var a = 1,这句话会被拆分成两句:
var a;
a = 1;
也就是说图3中直接打印a就等同于图4这种情况。
动态作用域:指的就是作用域是在代码运行时才存在的这种情况,比如关键字this其实就是动态作用域的一种表现形式。因this涉及的东西比较多,所以打算在下一篇中详细的说明下。
网友评论