t的词法作用域的思考

王朝学院·作者佚名  2016-05-22
窄屏简体版  字體: 小  |  中  |  大  |  超大  

对于javascript的词法作用域的思考曾经看到过这样一段有意思的程序:

var a=3;function scopeTest(){ console.log(a); var a=2; console.log(a);}scopeTest();

在控制台上打印结果为:

undefined

2

对于第一次输出的undefined感觉到奇怪。

在查了一些资料后发现:

Javascript的运行其实要分为两个过程,第一个过程是词法分析,第二个过程是执行。在以上的这段程序中var a=3和var a=2这两个语句都可以分别看做是两部分;var a;是变量声明过程,a=3是变量赋值过程;这两个过程分别是在词法分析过程和执行过程执行的,由于词法分析过程的执行要先于执行过程,词法分析时将一个函数里面的所有变量声明都赋值给一个activeObject的属性如在scopeTest中:

scopeTest activeObject:{

a:undined

}

在函数执行时,当执行到console.log(a);发现一个变量,便去scopeTest activeObject中寻找a属性,如果找不到,去该函数的上一级的activeObject中寻找,直到查找到window对象;在该程序中在scopeTest activeObject中找到了a属性,然后变返回它的值undefined;在执行到 var a=2时;给scopeTest activeObject.a赋值为2,所以console.log(a);的值为2。我们通常把函数的activeObject称为作用域,把当前函数的activeObject和其父级的activeObject形成的这种从里向外的关系称为作用域链。

在词法分析过程中还会发生一些别的动作会产生一些有意思的事情我们以后再分析

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航