遇到一道题目
foo = function(){
this.myName = "Foo function.";
}
foo.prototype.sayHello = function(){
alert(this.myName);
}
foo.prototype.bar = function(){
setTimeout(this.sayHello, 1000);
}
var f = new foo;
f.bar();
运行结果 undefined,如何改正 。
——————————-
我刚开始想是setTimeout中的this指向改变了,改成了这样
foo.prototype.bar = function(){
var self = this;
setTimeout(self.sayHello, 1000);
} //undefined
然后给用试了下这样
foo.prototype.bar = function(){
var self = this;
setTimeout(self.sayHello(), 1000);
} // Foo function.
可以,但是不对。 setTimeout没有执行,弹出是马上弹了出来,所以加括号是直接调用了..
所以我查了下js调用方法加括号与不加括号的区别 。
原理上,fun()调用这个方法,fun则是指向这个对象。
回到开始,测了this被指向到了全局windows, 猜测是受setTimeout的执行环境影响,再次修改
foo.prototype.bar = function(){
setTimeout(this.sayHello.bind(this), 1000);
} //Foo function.
成功。