先看一道前端笔试题:
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对象模型-执行模型