【问题标题】:JavaScript Scope: How to create anonymous functions with different values?JavaScript Scope:如何创建具有不同值的匿名函数?
【发布时间】:2012-08-26 08:52:25
【问题描述】:

我有许多按钮,我想以编程方式为每个按钮添加一个 onclick 函数。 我希望这些函数知道它们附加到哪个按钮编号,但我不想解析按钮 ID 来获取数字。一定有更好的办法:

    require(["dojo/dom", "dojo/domReady!", "dojo/on"], function(dom, domReady, on) {
        for (var i = 0; i < 10; i++) {
            on(dom.byId("button"+ i), "click", function(e) {
                console.log("Number: "+ i);
            });
        }
    });

如何添加一个函数以便它正确输出按钮编号而不执行此操作:

console.log("Number: "+ e.srcElement.id.substring(6));

【问题讨论】:

  • 检查this,在循环中使用闭包。

标签: javascript dojo


【解决方案1】:

怎么样

for (var i = 0; i < 10; i++) {
    on(dom.byId("button"+ i), "click", (function(number){
        return function(e) {
            console.log("Number: "+ number);
        };
    })(i));
}

【讨论】:

  • 谢谢你,这行得通!但为什么?在这种情况下,括号有什么作用?
  • 我使用IIFEi 作为参数返回一个函数,该函数在循环中的该点使用i 的值,因此为number 创建了闭包i
  • 谢谢,我不知道 IIFE。这真的很有帮助!
【解决方案2】:

您可以通过dojo/_base/lang::partial 实现相同的目的:

require([
    "dojo/_base/lang",
    "dojo/dom",
    "dojo/on",
    "dojo/domReady!"
], function(
    lang,
    dom,
    on
) {

    var button_onClick = function(i, event) {
        console.log("Number:", i);
    }

    for (var i = 1; i <= 3; i++) {
        on(dom.byId("button" + i), "click", lang.partial(button_onClick, i));
    }

});​

在 jsFiddle 上查看一个工作示例:http://jsfiddle.net/phusick/KhsXB/

【讨论】:

  • 谢谢,这也有效。遗憾的是,我不能接受这个问题的两个答案。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2019-05-19
  • 1970-01-01
相关资源
最近更新 更多