【问题标题】:Creating a function reference that has value parameters not references创建具有值参数而不是引用的函数引用
【发布时间】:2011-01-27 22:10:57
【问题描述】:

我不确定如何准确地描述我想要的东西。我想定义一个函数,其参数是本地 VALUE 而不是引用。

假设我有想要创建的对象列表

for(i = 0; i < 10; i++){
  var div = document.createElement("div");
  div.onclick = function(){alert(i);};
  document.appendChild(div);
}

现在我相信这个例子无论我点击什么div,它都会提示“10”;因为这是变量 i 的最后一个值;

有没有办法/如何创建一个函数,其参数是我指定函数时的值......如果这有任何意义。

【问题讨论】:

标签: javascript function closures parameter-passing


【解决方案1】:

你可以使用匿名函数:

for(i = 0; i < 10; i++){
    (function(i){
        var div = document.createElement("div");
        div.onclick = function(){alert(i);};
        document.appendChild(div);
    })(i)
}

【讨论】:

    【解决方案2】:

    您需要在另一个函数中创建该函数。

    例如:

    div.onclick = (function(innerI) {
        return function() { alert(innerI); }
    })(i);
    

    此代码创建一个函数,该函数接受一个参数并返回一个使用该参数的函数。由于外部函数的参数是按值传递的,因此可以解决您的问题。

    将外部函数设为单独的命名函数通常更清楚,如下所示:

    function buildClickHandler(i) {
        return function() { alert(i); };
    }
    
    for(i = 0; i < 10; i++){
        var div = document.createElement("div");
        div.onclick = buildClickHandler(i);
        document.appendChild(div);
    }
    

    【讨论】:

    • 现在我想如果我也想通过'this',我必须对函数进行curry? div.onclick= function(){somefunction(i,this)};
    • @Sheldon:正确。或者,someFunc.call(this, i) 将允许您在 someFunc 内部使用 this
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多