在javascript闭包中为什么this.name打印出来的是this.window的呢?求解释?


图片描述

在javascript闭包中为什么 this.name 打印出来的是 this.window 的呢?求解释?

求大神们解答~

javascript闭包 JavaScript

哎哟-重口哦 9 years, 10 months ago

你预期的代码其实是这样的:


 getFunc: function () {
        var self = this;
        return function () { return self.name; }
    }

在全局环境下,this指向的是 windows (浏览器)。在函数中,this指向的对象在于这个函数是怎么调用的。

调用方式1:


 function foo() {
   console.log(this);
}

foo();

在这种情况下,this默认是windows,这种调用方式相当于 windows.foo() 。在严格模式下,上面的调用方式,this应该是undefined。

调用方式2:


 var b = {
  foo: function () { console.log(this); }
}

b.foo();

在这种情况下,this是对象b。

第三种情况:


 var b = {
  foo: function () { 

     function bar() {
        console.log(this);
     }

     bar();
  }
}

b.foo();

b.foo() 调用后,在foo函数内,this已经被赋值了,this引向的对象是 b 。所以在函数 bar 中,输出的 this b 。而在你的代码中,你的代码虽然有闭包,但是没啥用。你想在闭包里引用外面的 name 变量,正确的做法就是在闭包里,保存一个对象的引用,而这个 name 变量就在这个变量引用上。你可以用 var self = this 来保存这个对象的引用。虽然这个匿名函数是在外面调用(这也是闭包形成的原因),但是它依然能通过它的闭包来访问那个 self 变量。

N.sweet answered 9 years, 10 months ago

Your Answer