js是一门简单的严格面向对象语言,对于刚开始学习js的菜鸟来说,要想学好js有两条链是必须要掌握的,它们分别是:

作用域链 面向对象原型链 这里简单总结下有关作用域链的问题,首先要求我们得懂的js的词法分析,关于词法分析分为两部分来思考,分别是分析阶段和执行阶段。

分析阶段

在分析阶段,我们要懂得依次分析三样东西,他们分别是:

  • 先分析所传递参数
  • 再分析变量声明
  • 最后分析函数声明 一个函数能使用的局部变量,就是从上面三步分析得来的,而对于全局变量,我们就得沿着作用域链自下而上寻找了。

具体步骤:(注意:步骤是依次执行的)

  • 函数运行前的一瞬间,会生成Active Object(活动对象),简称AO。
  • 分析传递参数
    • 函数声明的参数,形成AO的属性,值全是undefined
    • 接收实参,形成AO相应属性的值
  • 分析var变量声明,如:var age
    • 如果AO上还没有age属性,则值是undefined
    • 如果AO上已经存在age属性,则不做任何影响
  • 分析函数声明,如 function foo () {}
    • 则把函数赋给AO.foo属性
    • 如果此前foo属性已经存在,则被无情的覆盖

执行阶段

最后分析执行过程,比如:变量的赋值操作、打印输出等

注意: 函数表达式也是一个赋值过程,在此阶段执行,特此注意!

下面简单分析几个案例:

案例一:

1
2
3
4
5
function test1 (age) {
    var age = 20;
    alert(age);
}
test1();

1、分析过程:

  • 形成 AO={}
  • 分析形参,AO={age:undefined}
  • 分析var age,发现AO已有age属性,不做任何影响

2、执行过程

1
2
AO.age=20
alert(age)

案例二:

1
2
3
4
5
6
7
 function test2 (a) {
     var a = 'hello';
     alert(a);
     function a () {}
     alert(a);
}
test2();

1、分析过程:

  • AO={}
  • 分析参数,AO={a:undefined}
  • 分析变量声明,AO已有a属性,因次不做任何影响。
  • 分析函数声明,AO.a=function(){},即a属性被覆盖成函数

2、执行过程

  • a=hello
  • alert(a);
  • alert(a);

案例三:

1
2
3
4
5
6
7
8
function a (b) {
    alert(b);
    function b () {
        alert(b);
    }
    b();
 }
 a(1)

1、分析过程

  • 形成AO={}
  • 分析参数,AO={b:undefined},接受实参,形成AO={b:1}
  • 分析变量声明,无var变量声明
  • 分析函数声明,AO.b=function (){} 2、执行过程
1
2
alert(b)
b(),然后alert(b)

小结

懂得js的词法分析还是很有必要的,这样会很清除函数的执行过程以及原理。以后遇到类似的问题或者面试题,只要严格按照上述的步骤进行推导,就会得出正确的答案!~~

(end)