我有这个对象:
Tr.Competence = function() {
var thisCount = //variableNumber;
this.name = "comp" + thisCount;
var newRow = parentTable.insertRow(-1);
var cell1 = newRow.insertCell(0);
var element1 = document.createElement('input');
element1.type = "button";
element1.value = "+";
element1.onclick = function() {
makeSpecialisation(thisCount, this.name)
};
cell1.appendChild(element1);
}
和这个功能:
function makeSpecialisation(parentCount, parentEl) {
window[parentEl + "SpecialisationCount"]++;
var specialisationName = parentEl + "Spe" + window[parentEl + "SpecialisationCount"] ;
//testing variables with an alert
alert(
"parentCount=" + parentCount +
" & parentEl=" + parentEl +
" & specialisationName=" + specialisationName +
" comXSpecialisationCount=" + window[parentEl + "SpecialisationCount"]
);
}
如果element1.onclick直接调用makeSpecialisation(thisCount,this.nom)(没有匿名函数),那么变量是正常的,但是在评估之后我不能使用它(在每个新的Tr.Competence实例调用上) 。 =>请参阅:http://jsfiddle.net/hq8U3/2/
如果element1.onclick使用匿名函数包装器调用makeSpe [...],我可以随时调用它,但变量是NaN或未定义(或JSFiddle上的空白)。 =>请参阅:http://jsfiddle.net/hq8U3/3/
我能做些什么才能使我的变量运作良好&我可以在onClick事件中调用它们吗?
答案 0 :(得分:0)
第一:
由于你有一个annon函数可以改变this
的范围,所以代替:
element1.onclick = function() {
makeSpecialisation(thisCount, this.name)
};
你需要这样做:
var self = this;
element1.onclick = function() {
makeSpecialisation(thisCount, self.name);
};
第二:再次因为它是annon函数你需要包装它并调用它来调用你的其他函数,所以上面就变成了这个:
var self = this;
element1.onclick = (function() {
makeSpecialisation(thisCount, self.name);
})();
第三:我认为你真的想要这样做:
element1.setAttribute('onclick', makeSpecialisation(thisCount, this.name));
在这种情况下,上述两件事很难知道,但无关紧要。
最后作为事后的想法,您应该使用console.log()
进行调试而不是alert()
。如果您忘记了调试,console.log()
将不会惹恼您的用户或破坏您的计划,例如alert()
。