先看一道前端笔试题:

var a=10;   

  function test(){        

    a=5;        

    alert(a);        

    alert(this.a);       

    var a;        

    alert(this.a);        

    alert(a);    

  }

  test();           //      5  10  10  5

  new test();    //      5  undefined  undefined  5

简单的解释为:

  1.JavaScript的作用域是函数作用域,定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在函数的任何地方都可见。

  2.this取决于函数调用的模式:

    (1)当调用某个对象的方法时,this被绑定到该对象。

    (2)当调用全局函数时,this被绑定到全局对象(浏览器中为window对象)。

    (3)当函数作为构造函数,使用new操作符生成新对象时,this被绑定到该新对象。

    (4)当执行call/apply方法是,this被绑定到call/apply方法的第一个参数和。

 

要想理解JavaScript的作用域需要理解以下几个概念:

执行环境(execution context)

变量对象(variable object) 活动对象(activation object)

作用域链(scope chain)

这两篇博客有比较清楚地讲解:理解Javascript_12_执行模型浅析  JavaScript对象模型-执行模型