欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

javascript作用域链与执行环境的详细介绍

来源:本站整理 作者:佚名 时间:2017-07-03 TAG: 我要投稿
全局执行环境最先进入,所以一直在底端;就和栈的概念差不多;
函数执行完之后,再把它的执行环境从作用域链顶端移除,它保存的数据和函数都被标记清除,等待垃圾回收;
控制权交给之前的执行环境,继续往下执行;
当页面关闭时,全局执行环境才销毁;
<script type="text/javascript">
 var a = 1;
 var b = 2;
 var c = 3;
 var d = 4;
 function inner(d) {//它的作用域链是inner---全局
 var c = 8;
 console.log(a);//1 当前作用域找不到a,去全局作用域找到了a=1
 console.log(b);//2 当前作用域找不到b,去全局作用域找到了b=2
 console.log(c);//8 当前作用域找到了c=8
 console.log(d);//7 当前作用域找到了d=7,形参也是局部作用域
 // console.log(e);//ReferenceError: e is not defined 引用错误,找不到e, 它的作用域链是inner---全局
 console.log(a+b+c+d);//18
 }
 function outter(e) {
 var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效
 var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效
 inner(7);
 }
 outter(999);//这个999无效,里面的e根本找不到
</script>
以上代码的执行顺序:
代码执行进入全局执行环境,并对全局执行环境中的代码进入声明提升;
 执行第2行,赋值a=1; 然后第3行赋值b=2; 然后第4行赋值c=3; 然后第5行赋值d=4;
 执行第20行,调用outer(999)函数,然后进入outer(999)函数执行环境,声明提升,并将实参999传给形参e;现在环境栈中有两个执行环境,outer(999)是当前执行环境;
 执行第16行,赋值a=5; 然后第17行赋值b=6;
 执行第18行,调用inner(7)函数,然后进入inner(7)函数执行环境,声明提升,并将实参7传给形参d;
 执行第7行,赋值c=8; 然后运算并输出;
代码优化
由于在作用域链上查找变量是需要消耗性能的,我们应该尽快的找到变量,所以在函数多层嵌套的时候,我们应尽可能的使用函数内部的局部变量;
我们在函数内部使用全局变量可以说是一种跨作用域操作,如果某个跨作用域的值在函数的内部被多次使用,那么我们就把它存储到局部变量里,这样可以提高性能。

上一页  [1] [2] 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载