作用域的简述:在一段程序代码中用的名字(变量)并不是总是有效的和可用的,而通过限定这个名字的作用范围就是作用域。在JS中作用域又分为:全局作用域 ,局部作用域。
<script> //整个<script>标签就是全局作用域 var num = 1;//这个num是全局有效的 console.log(num); function fn() { var num = 10;//(在函数里面的就是局部作用域)这个num是局部作用域,虽然变量名一样了,在不同作用域下是不会影响的, console.log(num); } fn(); </script>
运行截图:
当然根据作用域的不同,变量也不同,就有了全局变量和局部变量。 如上图代码,在全局作用域下声明的变量为全局变量,在函数内部声明的变量为局部变量。另外函数的形参也是一个局部变量。注意:还有一种特殊情况,如果在函数内部是没有声明,直接进行赋值的变量也是全局变量。从执行效率来看,局部变量 > 全局变量。因为局部变量只有当浏览器关闭是才会销毁,比较占内存资源,而局部变量是当这个函数执行完毕时便会自动销毁。
作用域链简述:通俗的解释就是一个函数要调用这个值,而自己没有,则会向上一级去获取,上一级没有则继续往上,如果都没有的话,则会出现is not defined。
作用域链案例1:num输出的值是多少?
<script> function fn1() { var num = 12; function fn2() { console.log(num); } fn2(); } var num = 34; fn1(); </script>
运行截图:
作用域链案例2:num1,num2输出的值是多少?
<script> function fn1() { var num2 = 4; function fn2() { var num1 = 5; var num2 = 123; function fn3() { var num1 = 12; console.log (num1,num2); } fn3(); } fn2(); } fn1(); </script>
运行截图: