关于this的指向性问题

发布于 2022-09-05 05:02:35 字数 257 浏览 24 评论 0

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        return function(){
            return this.foo;
        };
    }
};
var f = obj.getFoo();
console.log(f());  //结果:window

为什么上述代码的运行结果是window呢?

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

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

发布评论

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

评论(11

孤君无依 2022-09-12 05:02:35

函数执行,函数体内的this指向函数的调用方

1、下面这段代码,getFoo函数的调用方是obj,所以getFoo函数内部的this指向obj对象

var f = obj.getFoo()

2、getFoo函数返回了一个匿名函数赋给变量f,再执行函数f,此时变量f是挂载到window上的,函数f的调用方是window,函数f内部的this也指向window

console.log(f());  //结果:window
ゃ人海孤独症 2022-09-12 05:02:35

obj.getFoo() 返回一个方程,赋值给了 f 。
f 通过 f() 被调用,没有明确的调用者,所以 this 就是 window

想要的到 "obj" ,可以这样做

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        var self = this;
        return function(){
            return self.foo;
        };
    }
};

var f = obj.getFoo();
console.log(f());
紅太極 2022-09-12 05:02:35

因为,在f()实际运行的地方,thiswindow,由于没有通过call或者bind改变上下文,所以输出的就是window

可以按照如下替换方法:

console.log(f());
// ----->
console.log(obj.getFoo());
// ----->
console.log(function() {
    var self = this;
    return function() {
        return self.foo
    }
});

这里的self就是指向window了,所以return self.foo就是return window.foo,也就是'window'

洋洋洒洒 2022-09-12 05:02:35

其实最简单的理解就是obj.getFoo给了f,然后再看这方法运行的位置在哪.

f = function () {
    return function () {
        return this.foo
    }
}
忆伤 2022-09-12 05:02:35

console.log(f())中f()是独立被调用的
1.如果调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。
2.如果函数独立调用,那么该函数内部的this,则指向undefined。
推荐阅读 http://www.jianshu.com/p/d647... 希望对你有所帮助

攒眉千度 2022-09-12 05:02:35

在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。如果函数独立调用,那么该函数内部的this,则指向undefined。但是在非严格模式中,当this指向undefined时,它会被自动指向全局对象。链接描述
这里f()所引用的函数是在独立调用,所以在非严格模式下this指向全局对象。

温柔女人霸气范 2022-09-12 05:02:35

this 指向函数的直接调用者。

穿透光 2022-09-12 05:02:35

闭包中 this 指向全局变量

泛滥成性 2022-09-12 05:02:35

因为 obj.getFoo() 返回一个匿名函数;
实际上
var f = obj.getFoo(); //实际上就是执行下面这段代码

var f = ()=>this.foo; //this指向全局

清醇 2022-09-12 05:02:35

定义个局部变量指向this

var vm = this

或者使用es6中箭头函数=>可以直接在内部方法中使用this

幸福还没到 2022-09-12 05:02:35
var f = obj.getFoo(); //这句f获取到了函数的引用
console.log(f());  //这句才是执行函数,所以this指向window
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文