【问题标题】:Onclick function with parent-dependant parameters具有父相关参数的 Onclick 函数
【发布时间】:2014-07-16 22:34:58
【问题描述】:

我有这个对象:

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 事件中调用它们?

【问题讨论】:

    标签: javascript onclick wrapper


    【解决方案1】:

    第一:

    因为你有一个改变this范围的annon函数,所以代替:

    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() 那样惹恼您的用户或破坏您的程序。

    jsfiddle here

    【讨论】:

    • @PublicMani 当然所有这些都是猜测,因为我不完全确定您要达到的目标。
    • “因为它是 annon 函数”不是原因。函数是“匿名的”(即由没有可选名称的函数表达式创建)还是命名与特定执行上下文中的 this 的值无关。 “改变 this 的范围”的是函数的调用方式,而不是它的定义或初始化方式。请注意,this 的“范围”永远不会改变,它总是在当前执行上下文中解决。改变的是值,这完全取决于函数的调用方式(或通过使用 bind)。
    • @RobG 我的意思不是说因为这是一个 annon 函数,它改变了,而是因为他在他想使用的 this 的实例之间有一个函数。此外,函数的调用方式不会改变this 的范围。 this 总是解析为最近的父函数的范围,无论它是否是 annon。
    • 您的第一个更改可能是 OP 想要的(即 self.name)。函数表达式更改为 IIFE 的下一部分完全改变了结果,这意味着调用 makeSpecialisation 的结果被赋值。 this 的值是在进入执行上下文时设置的,它可能与函数相关但不一定(例如全局代码)。
    • @RobG 确实,第一个变化/点是我想要实现的,它解决了问题!感谢您提供关于范围的精确信息。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2015-12-20
    • 2016-07-08
    相关资源
    最近更新 更多