2

我们先来看看 JavaScript 代码 =>

function ConstructNodes(className,hiddenId,alertMsg,formName){
    this.className = className;
    this.hiddenId  = hiddenId;
    this.alertMsg  = alertMsg;
    this.formName  = formName;
}

ConstructNodes.prototype.getId = function(){
    var nodes = document.getElementsByClassName(this.className);
    for (var i=0;i<nodes.length;i++){
        nodes[i].onclick = function(){
            var r = confirm(this.alertMsg);
            if (r==true){
                alert(this.hiddenId); // undefined
            } else {
                return;
            }
        };
    }
};

var obj = new ConstructNodes("className","hiddenId","Are you sure ?","formName");
obj.getId();

我在这种情况下的问题是在getId的匿名函数下定义的对象是未定义的,我该如何解决这种情况?谢谢

4

3 回答 3

4

您的代码错误地假设this它将引用事件处理程序内的“ConstructNodes”对象。它不会;这将是元素。相反,存储this在一个对象中,事情会更好:

ConstructNodes.prototype.getId = function(){
    var nodes = document.getElementsByClassName(this.className), obj = this;
    for (var i=0;i<nodes.length;i++){
        nodes[i].onclick = function(){
            var r = confirm(obj.alertMsg);
            if (r==true){
                alert(obj.hiddenId); // undefined
                document.getElementById(obj.hiddenId).value = this.id;
                alert(obj.hiddenId);
            } else {
                return;
            }
        };
    }
};

(完全不清楚您要做什么,因此可能仍然存在一些问题。)

于 2012-08-22T22:07:30.497 回答
1

我花了一分钟才明白你的问题。

您不能this在 getId 的匿名函数中引用。您必须保存this到变量中,例如var me = this在匿名函数之外,然后使用me.hiddenId.

这是一个JSFiddle来证明这一点。

于 2012-08-22T22:06:00.290 回答
1

这是undefined因为您无法this像那样访问该功能。任何函数都使用它自己的执行上下文调用,因此this在这种情况下与函数外部不同。

您可以通过在外部范围中定义 avar并在内部访问它来解决这个问题,如下所示:

function ConstructNodes(className,hiddenId,alertMsg,formName){
  this.className = className;
  this.hiddenId  = hiddenId;
  this.alertMsg  = alertMsg;
  this.formName  = formName;
}

ConstructNodes.prototype.getId = function() {
  var _this = this; // a reference that will be known in your closure/function
  var nodes = document.getElementsByClassName(this.className);
  for (var i = 0; i < nodes.length; i++) {
    nodes[i].onclick = function(){
      if (confirm(_this.alertMsg)) {
        alert(_this.hiddenId); // no longer undefined
      } else {
        return;
      }
    };
  }
};

var obj = new ConstructNodes("className", "hiddenId", "Are you sure?", "formName")
obj.getId();
于 2012-08-22T22:13:25.973 回答