Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的简单事件处理示例不起作用?_Javascript_Scope - Fatal编程技术网

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");
}