对于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形成的这种从里向外的关系称为作用域链。
在词法分析过程中还会发生一些别的动作会产生一些有意思的事情我们以后再分析