我已经尝试通过阅读来了解此关键字引用的内容。好吧,那没有帮助。所以请帮帮我这个! 手动函数调用与事件监听器绑定之间的区别在哪里?
var app = {
foo: true,
bar: function() {
console.log("this",this.foo);
console.log("app",app.foo);
}
}
app.bar();
/* this true
app true */
document.addEventListener("click", app.bar);
/* this undefined
app true */
感谢您的帮助
答案 0 :(得分:5)
在document.addEventListener
this
内部会引用document
,因为您正在调用document
对象的函数。当您直接致电app.bar()
时,this
会因同一原因引用app
个对象。
如果您想引用app
,则必须使用bind()
手动重新定义函数的上下文:
document.addEventListener("click", app.bar.bind(app));
答案 1 :(得分:3)
它不是this
,而是foo
未定义,因为当this
被document
绑定为app.bar
的事件监听器时,document
为this.foo
。因此document.foo
变为document.foo = "document.foo";
var app = {
foo: true,
bar: function() {
console.log("this",this.foo);
console.log("app",app.foo);
}
};
app.bar();
/* this true
app true */
document.addEventListener("click", app.bar);
/* this document.foo
app true */
,这是未定义的。
app.bar
http://jsbin.com/efitah/2/edit
您可以使用函数来调用document.addEventListener("click", function(event){
app.bar();
});
{{1}}
答案 2 :(得分:0)
我在这里遇到了幸运的打击......用module pattern来试试 我从来没有关闭,但他们似乎在这里为我工作。如果有人对闭包有很好的解读,请发表评论!
var app = (function() {
var foo = true;
return {
bar: function() {
console.log(foo);
}
};
})();
app.bar(); //true
document.addEventListener("click", app.bar); //true
编辑:对不起,我只是认为这与此关键字无关。
答案 3 :(得分:0)
document.addEventListener("click", app.bar.bind(app);