Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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_Closures - Fatal编程技术网

Javascript 假定作为方法执行的内部函数返回未定义的

Javascript 假定作为方法执行的内部函数返回未定义的,javascript,closures,Javascript,Closures,有人能解释一下我为什么会出现下面所示的错误吗?谢谢 资料来源: Richard Cornford的“Javascript闭包” 完整版本在 这里我得到了TypeError:obj[methodName]不是一个函数 return obj[methodName](e, this); }); }; function DhtmlObject(elementId){ var el = document.getElementById(elementId); if(el){ e

有人能解释一下我为什么会出现下面所示的错误吗?谢谢

资料来源: Richard Cornford的“Javascript闭包”

完整版本在

这里我得到了TypeError:obj[methodName]不是一个函数

    return obj[methodName](e, this);
  });
};

function DhtmlObject(elementId){
  var el = document.getElementById(elementId);
  if(el){
    el.onclick = associateObjWithEvent(this, "doOnClick");
    el.onmouseover = associateObjWithEvent(this, "doMouseOver");
    el.onmouseout = associateObjWithEvent(this, "doMouseOut");
  }
};

DhtmlObject.prototype.doOnClick = function(event, element){
    console.log('OnClick');
};
DhtmlObject.prototype.doMouseOver = function(event, element){
    console.log('MouseOver');
};
DhtmlObject.prototype.doMouseOut = function(event, element){
    console.log('MouseOut');
};

var test = DhtmlObject("test");

原因是对象
this
没有引用您认为它所做的事情。它引用全局对象,即window,window没有这些方法


您应该在最后一行中使用
new
关键字创建对象DhtmlObject。这将使
绑定到您的新对象。

原因是对象
与您认为它的功能无关。它引用全局对象,即window,window没有这些方法


您应该在最后一行中使用
new
关键字创建对象DhtmlObject。这将使
这个
绑定到您的新对象。

现在就完美了!非常感谢你!好极了!非常感谢你!
    return obj[methodName](e, this);
  });
};

function DhtmlObject(elementId){
  var el = document.getElementById(elementId);
  if(el){
    el.onclick = associateObjWithEvent(this, "doOnClick");
    el.onmouseover = associateObjWithEvent(this, "doMouseOver");
    el.onmouseout = associateObjWithEvent(this, "doMouseOut");
  }
};

DhtmlObject.prototype.doOnClick = function(event, element){
    console.log('OnClick');
};
DhtmlObject.prototype.doMouseOver = function(event, element){
    console.log('MouseOver');
};
DhtmlObject.prototype.doMouseOut = function(event, element){
    console.log('MouseOut');
};

var test = DhtmlObject("test");