如何将参数传递到内部函数中

How to pass parameter into internal function

本文关键字:内部函数 参数传递      更新时间:2024-06-07

我没能把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作为参数?

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

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

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

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的当前值的原因是它不会在循环的当前步骤使用该值。相反,当onready出现时,它将使用i的值,该值在循环结束时已经达到最大值。

您可以简单地使用一个函数外壳。

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);
 }
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);
}

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

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); });
});

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

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

语法

var intervalID=window.setInterval(函数,延迟[,param1,param2,…]);var intervalID=window.setInterval(代码,延迟);

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

我使用j作为形式参数,以表明它不是从外部范围使用i

对于(var i=0;i<3;i++){myWidgets[i].onpready=函数(){setInterval(函数(j){var pVal=$('#Pv'+(j+1)).text();myWidgets[j].setValue(pVal);},1000,i);};}