关于js中的作用域和作用域链以及常见的问题和结果方法

来源:互联网 发布:数据分析师前景 知乎 编辑:程序博客网 时间:2024/05/16 15:44

在js中不仅有原型链还存在这作用域和作用域链。首先在介绍作用域和作用域链之前,先让我们了解一下局部变量和全局变量

1.全局变量和局部变量

全局变量:定义在函数外部的变量可以被叫做全局变量
局部变量:定义在函数内部的变量,但是如果变量在函数内部没有使用var来声明,那么该变量也会被认为是全局变量。
1,全局变量对应的作用域是整个代码,即在代码的任何部分都是可以调用该变量的
2,局部变量对应的作用域是函数内部,只能在函数内部使用,如果在函数外部使用就会出错
3,局部变量的优先级大于全局变量,即如果全局变量和局部变量名字一样,那么在函数内部局部变量会覆盖掉全局变量。

2.函数作用域

变量在声明它的函数体内以及该函数内部嵌套的任何函数体内都是有定义的。这句话是什么意思呢?我们可以出个很容易出错的代码
<script type="text/javascript">//函数作用域var num=2;function fun(){console.log(num);var num=3;console.log(num);}fun();</script>
在这个demo中,你的第一印象会输出什么呢?
1.如果你的脑海中的结果是第一个num=2.第二个num=3.那么恭喜你完全打错了。\
2.如果你的答案是第一个num=undefined,第二个num=3,那么你就可以提过这一部分啦。
肯定所有的人都知道第二个num输出3,但是第一个为什么输出undefined有些人可能不清楚,我会带着您一起解析一下...

解答:在该部分我们首先就抛出了一个函数作用域的概念,即变量在声明它的函数以及该函数所嵌套的任意函数内都是有定义的,所以说上面的代码我们可以这样理解
<script type="text/javascript">//函数作用域var num=2;function fun(){var num;console.log(num);num=3;console.log(num);}fun();</script>
很明显的看到在第一个输出的上面我们添加了一个var num;此时并没有赋值,所以这时候在函数内部输出num的话得出的值就是undefined。

3.函数作用域链

在上面的代码中我们分析了一种常见的可能会出错的情况,接下来我们就进入函数作用域链。
在js中函数可以嵌套,多个函数嵌套在一起,所以多个作用域就会相互嵌套,这种情况下就形成了作用域链。
其实整个直接用代码就可以说的很清晰:
<script type="text/javascript">var num=1;function fun(){var num=2;function fun1(){var num=3;console.log(num);}function fun2(){console.log(num);}fun1();fun2();}fun();</script>
上面的代码片段其实很清晰的表明了函数作用域中变量的查找规律,输出结果是3,2.

4.函数作用域中变量的访问原则

首先会在当前函数的作用域中查找,如果没有的话会沿着作用域链向上查找, 直至全局作用域如果还没有的话就返回undefined

5,总结

按照惯例就行一下总结,只要对函数作用域理解清晰,那么函数作用域链理解起来也会简单很多。其实作用域链的查找规则和原型链的查找规则蛮像的。最好还是自己手动写一个小demo实验一下,眼见为虚,手动才是实际的。


0 0
原创粉丝点击