搜尋

首頁  >  問答  >  主體

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

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

求大神们解答~

伊谢尔伦伊谢尔伦2911 天前556

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-10 15:03:23

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

    1

    2

    3

    4

    5

    <code>    getFunc: function () {

            var self = this;

            return function () { return self.name; }

        }

    </code>

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

    调用方式1:

    1

    2

    3

    4

    5

    6

    <code>function foo() {

       console.log(this);

    }

     

    foo();

    </code>

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

    调用方式2:

    1

    2

    3

    4

    5

    6

    <code>var b = {

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

    }

     

    b.foo();

    </code>

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

    第三种情况:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    <code>var b = {

      foo: function () {

     

         function bar() {

            console.log(this);

         }

     

         bar();

      }

    }

     

    b.foo();

    </code>

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-10 15:03:23

    1

    <code>每个函数在被调用时都会自动取得两个特殊变量:this和arguments.而内部函数在搜索这两个变量时,只会搜索到其活动对象为止。obj.getFunc()执行完后,返回匿名函数function(){return this.name;}的引用,obj.getFunc()(),执行匿名函数,此时这个执行环境是在全局作用域下,而它的活动对象为全局变量的name=”The Window”,因此,this.name返回The Window.</code>

    回覆
    0
  • 取消回覆