应该作为方法执行的内部函数返回undefined

时间:2015-10-24 19:28:20

标签: javascript closures

有人可以解释为什么我会收到下面显示的错误吗?感谢

来源: Richard Cornford的“Javascript Closures”http://www.jibbering.com/faq/notes/closures/#clObjI

Plnkr

的完整版
function associateObjWithEvent(obj, methodName){
  return (function(e){
    e = e||window.event;
    console.log(typeof obj[methodName]); // undefined

这里我得到 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");

1 个答案:

答案 0 :(得分:4)

原因是对象this没有引用您的想法。它指的是全局对象,即窗口,窗口没有这些方法。

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