我们知道javascript中存在两条链,作用域链和原型链,之前一直模模糊糊, 今天复习JS高级程序设计3时,打算写文章整理一下,加深理解. // var a=1; //全局对象 ① var fn1=function(){ //var a=2; // ② function fn2(){ //var a=3;// ③ ⑥⑦⑧⑨⑩⑪⑫ console.log(a); } fn2();//调用fn2 }; var fn4=function(){ var a=6;// ④ function fn5(){ var a=7;// ⑤ console.log(a); } fn5(); } //先看fn1函数执行过程 fn1(); // 3 在③处找到了a /* 把③注释掉,执行结果为2,在②处找到了a 把②注释掉,执行结果为1,在①处找到了a 把①注释掉, 执行结果为 ReferenceError: a is not defined 结果找不到了 */ 看这个图://同样的,执行fn4,按上面的分析流程也可以得到相似的结果 总结:每一个<script>标签下的变量和函数存放在0级作用域, <script>下的每一个函数为1级作用域,1级作用域下的再定义一个函数, 为2级作用域,2级作用域再定义一个函数为3级作用域,1级作用域下嵌套n层函数为n+1层作用域, 单独说有些抽象,举个例子: //=============分割线==================== <script> var b=0; //0级作用域 function fn1(){ var b2=2; function fn2(){ var b3=3; function fn3(){ } function fn4(){ } } } //fn1为1级作用域,fn2为2级作用域,fn3为3级作用域 fn3为函数fn1的两层嵌套函数,fn1的为1级作用域 所以fn3的作用域为n+1=2+1=3; 同理,fn4也为3级作用域。 作用域链的查找过程: 当查找某个变量时,首先在当前的作用域查找,如果找到了,就使用, 整个查找过程结束,否则,则沿着作用域链向上一层(0级>1级>2级>3级>4级>····n级) 查找到则使用,否则继续沿着作用域链向上一层查找,直到0级作用域。 0级作用域为作用域的顶端,0级作用域中还没找到,则返回 ReferenceError: a is not defined 整个查找过程结束 </script>
转载请注明:副业 and 脱单研究所 » 详解JS中的作用域