this关键字问题

如图所示,这里调用obj.getAge()后为什么this会指向windows/undefined,不是obj调用了它吗,this不应该是指向obj吗??
clipboard.png

对比:像这里person。showName()的this就是指向person的啊,不是谁调用this就指向谁吗
clipboard.png

阅读 1.8k
3 个回答

因为fn是个匿名函数

举个简单例子

    var obj = {
        fn1: function() {
            console.log(this);//此处输出obj本身
            var noNamed = function() {
                console.log(this);//此处输出windowd对象
            };
            return noNamed();
        }
    };
    obj.fn1();

以上,你的var fn=function(){};return fn()本质上就是个直接调用的匿名函数闭包 return function(){}
你只是将这个匿名函数赋值给fn了,并不能改变他没函数名的本质

结论:只要是匿名函数,this就指向window全局对象,例如:

function foo() {
    var fn = setTimeout(function() { //我是匿名函数
        console.log(`setTimeout的this不会随foo改变:${this.age}`); 
    }, 0);
}
foo.call({
    age: '1000'
});//输出undefined

var name = 'XL';
var person = {

name: 'xl',
showName: function() {console.info(this.name)}

}

person.showName();
// 这里showName调用位置是person上下文,所以作用的this被绑定到person上
var showNameA = person.showName;
// 这里的showNameA类似于函数别名,showNameA是person.showName的引用,showNameA调用位置依旧是window.
//this的绑定是与它调用位置有关的

var obj = {

birth: 1990,
getAge: function() {
    var b = this.birth;
    var fn = function() { console.info(this)}
}
return fn;

}

你的那个obj中的getAge中涉及到闭包,其实可以理解为返回一个函数fn,obj.getAge()完成后继续执行fn,此时的调用位置是在Window环境下,所以fn中的this指向window

this 不懂

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题