做得更好,
asset.addEventListener("load", function () {
this.emit({
type: "load",
asset: asset
});
}.bind(this), false);
或者
var scope = this;
asset.addEventListener("load", function () {
scope.emit({
type: "load",
asset: asset
});
}, false);
绑定函数或仅将this
的引用存储在变量中是否更好?
答案 0 :(得分:4)
这实际上取决于许多因素。以下是一些注意事项:
从历史上看,从.bind()
创建的函数速度较慢。
绑定this
无法更改其值,而变量可以。 (猜猜你希望它不会在这里改变。)
您将丢失元素引用,但您仍然可以通过event.currentTarget
获取它。
另一个需要考虑的选择是让您的对象实现事件监听器接口。这将允许您将对象本身作为处理程序传递,并将调用您提供的handleEvent()
方法的实现。
然后this
值将自动成为您的对象。
因此,如果您的this
是来自构造函数的对象,则可以执行此操作:
function MyCtor() {
// your constructor
}
// This implements the `Event Listener` interface
MyCtor.prototype.handleEvent = function(event) {
// ------v----should be "load"
return this[event.type](event)
};
// This is the `load` handler
MyCtor.prototype.load = function(event) {
this.emit({
type: "load",
asset: event.currentTarget
});
};
然后像这样绑定处理程序:
asset.addEventListener("load", this, false);
现在,handle事件中this
的值将成为您的对象,因此您可以调用其他方法,并且不需要.bind
或闭包变量。
答案 1 :(得分:2)
我觉得第二种选择更好,只是为了防止任何混淆。 this
的使用一直是许多JavaScript问题的问题,所以当你可以避免它时,你应该在我看来。顺便说一下,这也是在像Knockout这样的库中完成的。
如果您想了解有关this
关键字的更多信息,可以很好地解释this
在不同背景下可能存在的各种不同值:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/
答案 2 :(得分:0)
第二个选项与更多浏览器兼容。 IE 8及以下版本不支持bind()函数,如果这对你很重要。
关于绑定的Mozilla页面有一个pollyfill for the bind function。根据我的经验,添加到内置对象的原型通常是一个坏主意。所以第二种选择是"更好" - 只需确保使用描述性变量名称而不是""或"范围"。使用通用名称会让人感到困惑,尤其是在添加更多功能时。
答案 3 :(得分:-1)
它们都没有,因为它们都创建了以后永远无法删除的匿名函数。
var scope = this;
var handler = function () {
scope.emit({
type: "load",
asset: asset
});
};
asset.addEventListener("load", handler, false);