深刻理解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

  

  

原文地址:https://www.cnblogs.com/wangyunhui/p/10423729.html