2012-08-22 48 views
2

讓我們先來看看在JavaScript代碼=>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的匿名函數未定義,我怎樣才能解決這種情況呢?謝謝

+2

可能重複(HTTP://計算器

可以通過在外部範圍和訪問它在內部限定了var,這樣解決了.com/questions/2079703/this-in-event-handlers-for-another-object) –

+0

@FelixKling當我與實現類無關時它是如何重複的 – tnanoba

+0

@Tornike,你的''ConstructNodes''函數是類 – user907860

回答

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

+0

現在一切都很清楚,謝謝 – tnanoba

1

花了我一分鐘的時間來理解你的問題。

您不能在getId中的匿名函數中引用this。 您必須將this保存爲一個變量,例如var me = this以外的匿名函數,然後使用me.hiddenId

這是一個JSFiddle來證明這一點。

+0

我怎樣才能回到你能以身作則嗎? – tnanoba

+1

這完全不相干。 – Pointy

+0

你說得對 - 我誤解了這個問題。我修復了答案和JSFiddle。 –

1

這是undefined因爲你不能像那樣訪問那個函數中的this。 任何函數調用它自己的執行上下文,因此this在這種情況下是不同的功能之外。

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(); 
[在事件處理程序這對於另一個目的]的
相關問題