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

发布于 2022-09-01 05:48:27 字数 209 浏览 14 评论 0

图片描述

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

求大神们解答~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

茶色山野 2022-09-08 05:48:27

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

    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中,输出的thisb 而在你的代码中,你的代码虽然有闭包,但是没啥用。你想在闭包里引用外面的name变量,正确的做法就是在闭包里,保存一个对象的引用,而这个name变量就在这个变量引用上。你可以用var self = this来保存这个对象的引用。虽然这个匿名函数是在外面调用(这也是闭包形成的原因),但是它依然能通过它的闭包来访问那个self变量。

七秒鱼° 2022-09-08 05:48:27
每个函数在被调用时都会自动取得两个特殊变量:this和arguments.而内部函数在搜索这两个变量时,只会搜索到其活动对象为止。obj.getFunc()执行完后,返回匿名函数function(){return this.name;}的引用,obj.getFunc()(),执行匿名函数,此时这个执行环境是在全局作用域下,而它的活动对象为全局变量的name=”The Window”,因此,this.name返回The Window.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文