setTimeout第一个参数的疑问

var obj = {
    str : 'value',
    tall : function(){
        console.log(this.str);
    }
};

setTimeout(obj.tall, 1000);
setTimeout(obj.tall(), 1000);
setTimeout(function(){
    obj.tall(); 
}, 1000);

代码执行后,输出的结果分别是: undefined, value, value
对第一个打印“undefined”不理解?

阅读 4.4k
4 个回答

第一个等价于

setTimeout(function(){
    console.log(this.str)//this指向的是window
}, 1000);

按输出顺序应该是: value, undefined, value。

解释:
第一个是:

setTimeout(obj.tall(), 1000);

这句输出的,因为立即调用了obj.tall()

第二个是:

setTimeout(obj.tall, 1000);

解释参考:@crp205 答案。 this并不是指向obj的。

第三个:

setTimeout(function(){
    obj.tall(); 
}, 1000);

此时this指向obj

输出的结果应该是 value,undefined,value 吧,第一个的确是像上面那个说的那样。

新手上路,请多包涵

个人想法,有什么问题还望指正。
1.接着第一位的回答补充。

setTimeout(obj.tall, 1000);

类似于

setTimeout(function(){
        console.log(this.str);
    }, 1000);

里面函数的执行属于函数调用模式,函数调用模式this代表全局对象window

最后分享一道面试题:

var length=10;
function fn(){
    console.log(this.length);
}
var obj = {
    length:5,
    method: function (fn) {

        fn(); 
        arguments[0](); 
    }
};
obj.method(fn);
obj.method(fn, 123);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏