2013-12-10 3 views
-1

мне не удалось пройти 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); 
    }; 

Как я могу добавить я в качестве параметра?

следующее не работает, я не определен во внутренней функции в setInterval:

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

запустить его в цикле, или, как вы вывесили ли? Сделайте '$ ('# Pv' + j) .text();' using 'j.toString()' – Igle

ответ

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 встречается, который уже превышен, когда цикл закончен.

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); }); 
}); 
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); 
} 
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); 
    }; 
    } 
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); 
} 
Смежные вопросы