Javascript 为什么我的简单事件处理示例不起作用?
我正在尝试制作一个简单的事件处理程序 (注意,我并没有试图实现一个全面的发布/订阅模型;我只是对我的示例为什么不能像我认为的那样工作感兴趣) 我将对象的Javascript 为什么我的简单事件处理示例不起作用?,javascript,scope,Javascript,Scope,我正在尝试制作一个简单的事件处理程序 (注意,我并没有试图实现一个全面的发布/订阅模型;我只是对我的示例为什么不能像我认为的那样工作感兴趣) 我将对象的onPropChange属性设置为一个更简单的处理函数,但它没有被激发。我已经对此进行了调试,似乎在triggerEvent中,变量this引用了全局窗口对象。我认为它应该引用myObj(这正是我所需要的) 有人能解释一下我思维中的错误以及我是如何纠正的吗?非常感谢你的帮助 更改代码,创建obj,然后按如下方式返回: var myObj = (f
onPropChange
属性设置为一个更简单的处理函数,但它没有被激发。我已经对此进行了调试,似乎在triggerEvent
中,变量this
引用了全局窗口
对象。我认为它应该引用myObj(这正是我所需要的)
有人能解释一下我思维中的错误以及我是如何纠正的吗?非常感谢你的帮助
更改代码,创建obj,然后按如下方式返回:
var myObj = (function () {
var private = "X";
var obj = {
"onPropChange": null, // Fires when prop value is changed
// Methods
"getProp": getProp,
"setProp": setProp
};
function triggerEvent(eventName) {
if (obj[eventName]) {
obj[eventName]();
}
}
// Setter / Getter
function getProp() {
return private;
}
function setProp(value) {
private = value;
triggerEvent("onPropChange");
}
return obj;
})();
这样,您就有了对私有函数对象的引用
固定小提琴-
您可能更喜欢的另一种修复方法是使用.call函数:
function setProp(value) {
private = value;
triggerEvent.call(this, "onPropChange");
}
这指定要调用的方法(triggerEvent)中的This
我已经试过了-它不起作用。也许我误解了。如果你认为它有效,你能更新我的JSFIDLE并添加链接吗?谢谢。现在可以了。但是你能解释一下为什么我的原作不起作用吗?我对JS中的
这个的理解肯定有错误。你的解决方案是解决这个问题的“正常”方法吗?我发现这会降低代码结构的可读性,因为对象需要在代码中定义一半(或依赖变量提升)。这是一种方法,还有其他方法。原始版本不起作用,因为正如您所说,默认情况下,此
引用全局窗口。这里有一个很好的参考-@njreed请参阅编辑,以获得使用调用函数解决问题的更简单方法。谢谢。我更喜欢使用.call()
的解决方案;更加优雅。文章链接非常有用。我现在可以看出我的错误是没有意识到调用method()
和myObj.method()
之间的区别。非常感谢。
function setProp(value) {
private = value;
triggerEvent.call(this, "onPropChange");
}