深刻理解this的指向和var 定义的变量的问题
一般来说,在编程语言里我们常见的变量作用域就是词法作用域与动态作用域(Dynamic Scope),绝大部分的编程语言都是使用的词法作用域。词法作用域注重的是所谓的Write-Time,即编程时的上下文,而动态作用域以及常见的this的用法,都是Run-Time,即运行时上下文。词法作用域关注的是函数在何处被定义,而动态作用域关注的是函数在何处被调用。JavaScript是典型的词法作用域的语言,即一个符号参照到语境中符号名字出现的地方,局部变量缺省有着词法作用域。此二者的对比可以参考如下这个例子:
#1:变量-编程时的上下文
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); //2
#2:变量-编程时的上下文
var a = 2; function bar(){ var a= 3; function foo() {return a;} return foo; } bar()() //3
#3:this-运行时上下文
function foo() { //函数定义在全局 console.log( this.a ); } function bar() { this.a = 3; foo(); } this.a = 2; bar(); //3
#4:this-运行时上下文
function bar() { this.a = 3; function foo() { //函数定义在局部 console.log( this.a ); } foo(); } this.a = 2; bar(); //3