JavaScript: передать переменную из одной функции в другую, используя setInterval ()? - PullRequest
3 голосов
/ 08 декабря 2010

Итак, у меня есть функция, которая повторяет выполнение функции, например:

function(f){
  var variable;
  for(z = 0; z < 10; z++){
    variable = "cool";         
    setInterval(f)
  }

Кстати, настоящая функция НАМНОГО сложнее, чем эта, но это та же теория.Я хочу иметь возможность выполнить функцию в аргументе f и установить некоторые переменные (например, переменная ), чтобы эта функция могла использовать их, в целом это идея:

function say(f){
   var variable = "hey";
   setInterval(f);
}
say(function(){
   alert(variable)
});

Здесь должно появиться окно с предупреждением, гласящее: эй .Это теория, но она не будет работать:

Переменная «переменная» не определена

Возможно, браузер просто проигнорирует ошибку и выдаст предупреждение undefined .

Но в любом случае, как мне "передать" переменную без изменения ее области действия .

Ответы [ 4 ]

7 голосов
/ 08 декабря 2010

JavaScript имеет замыкания , поэтому вы можете сделать это:

var x = 0;
setInterval(function() {
   //do something with x
}, 1000);

В вашем конкретном случае вы должны сделать это:

function say(f){
   var variable = "hey";
   setInterval(function() { 
       f(variable); //invoke the say function's passed-in "f" function, passing in "hey"
   }, 1000);
}
say(function(arg){
    //arg will be "hey"
    alert(arg);
});

setInterval принимает два аргумента, второй - количество времени (в миллисекундах), которое вы хотите отложить на выполнение ссылки на переданную функцию.

3 голосов
/ 08 декабря 2010

Если вы предпочитаете иметь функцию без параметра, вы можете использовать call или apply метод:

function say(f){
   var variable = "hey";
   setInterval(function() { 
       f.call(variable); // set the context
   }, 1000);
}
say(function(){
    alert(this);
});
1 голос
/ 08 декабря 2010
function say(f){
  var variable = "hey";
  setInterval(function(){
    f.call(null, variable);
  }, 1000);
}
say(function(variable){
   alert(variable)
});

Используя вызов метода для функции.

1 голос
/ 08 декабря 2010

Учитывая, что лямбда-функция исходит из другой области, вы не можете использовать замыкание, чтобы получить значение в функции напрямую. Вам нужно будет передать значение вашей функции напрямую через замыкание и быть готовым получить его в лямбда-выражении:

function say(f){
   var variable = "hey";
   setInterval( function(){ f(variable) }, 500 );
}
say(function(yyy){
   alert(yyy);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...