如何将参数传递给内部函数

时间:2013-12-10 10:08:32

标签: javascript

我没有设法将i作为参数从onready()传递到setInterval(),所以同时我解析了循环:

function myFunc() {
  myWidgets[0].onready = function(){
    setInterval( function(){
      var pVal = $('#Pv1').text();
      myWidgets[0].setValue(pVal);
    }, 1000);
  };

  myWidgets[1].onready = function(){
    setInterval( function(){
      var pVal = $('#Pv2').text();
      myWidgets[1].setValue(pVal);
    }, 1000);
  };

  myWidgets[2].onready = function(){
    setInterval( function(){
      var pVal = $('#Pv3').text();
      myWidgets[2].setValue(pVal);
    }, 1000);
  };

如何添加i作为参数?

以下不起作用,我在setInterval的内部函数中未定义:

  myWidgets[i].onready = function(i){
    setInterval( function(i){
      var j = i + 1;
      var pVal = $('#Pv' + j).text();
      myWidgets[i].setValue(pVal);
    }, 1000);
  };

5 个答案:

答案 0 :(得分:2)

您可以使用附件通过i访问onready的当前值:

for (var i=0;i<3;i++) {
    (function(x){
        myWidgets[x].onready = function(){
            setInterval(function(){
                var pVal = $('#Pv' + (x+1) ).text();
                myWidgets[x].setValue(pVal);
            }, 1000);
        }
    })(i);
}

如果没有机箱,它无法使用i的当前值的原因是它不会使用循环当前步骤的值。而不是那样,它会在i发生时使用onready 的值,当循环结束时已经达到最大值。

答案 1 :(得分:2)

您可以简单地使用功能附件。

for (var i=0; i<3; i++) {
  (function(i) {
    myWidgets[i].onready = function() {
      setInterval(function(){
         var pVal = $('#Pv'+(i+1)).text();
         myWidgets[i].setValue(pVal);
      }, 1000);
    };
  })(i);
 }

答案 2 :(得分:1)

Try this. The case you are referring to is closure

myWidgets = [];
for(var i = 0; i < 3; i++) {
    myWidgets[i].onready = (function(i){
        return function(){setInterval( function(){
            var pVal = $('#Pv' + (i+1) ).text();
            myWidgets[i].setValue(pVal);
            console.log(i)
        }, 1000);}
    })(i);
}

答案 3 :(得分:0)

你可以做什么,但我不知道这是你问题的答案。

for(var i = 0; i < 3; i++) {
myWidgets[i].onready = function(){
     setInterval( function(){
        var pVal = $('#Pv' + (i+1) ).text();
        myWidgets[i].setValue(pVal);
     }, 1000);
};
}

它与范围和回调有关。您的解决方案不起作用,因为onReady的回调函数不知道上下文,例如不知道i

你可以用jQuery做得更好。 (每个小部件都有一个类myWidget)

$('.myWidget').ready(function () {
    var element = $(this); // is the widget of your code. 
    setTimeout(function () { element.val(element.val()*1 + 1); });
});

答案 4 :(得分:0)

您需要阅读您尝试使用的API的文档。

https://developer.mozilla.org/en-US/docs/Web/API/Window.setInterval 会告诉你:

<强>语法

    var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
    var intervalID = window.setInterval(code, delay);

借助@Haneev的答案借用代码,可以写成如下。

我使用j作为形式参数,以明确表示它没有使用外部作用域中的i

    for(var i = 0; i < 3; i++) {
    myWidgets[i].onready = function(){
         setInterval( function(j){
            var pVal = $('#Pv' + (j+1) ).text();
            myWidgets[j].setValue(pVal);
         }, 1000, i);
    };
    }