2014-11-28 5 views
0

У меня есть этот небольшой фрагмент кода (это внутри объекта):Модифицированного закрытие и SetTimeout

var tout = 0; 
self.initialize = function() { 
    for (var key in periods) { 
     setTimeout(function() { 
      self.server.sendData('customData', periods[key], 0); 
     }, tout); 
     tout = tout + 7000; 
    } 
} 

Как вы можете видеть, я перебор periods полого объекта, и мне нужен каждый ключ, чтобы быть видимыми внутри моего setTimeout() отдельно. В настоящее время это невозможно. Я что-то вроде этого пытается, в надежде на чудо:

self.initialize = function() { 
    for (var key in periods) { 
     var localkey = key; //here is the change 
     setTimeout(function() { 
      self.server.sendData('customData', periods[localkey], 0); 
     }, tout); 
     tout = tout + 7000; 
    } 
} 

Но очевидно, что чудо не произошло. Кто-нибудь знает, как подойти к этой проблеме?

ответ

0
self.initialize = function() { 
    for (var key in periods) { 
     (function(key) { 
      setTimeout(function() { 
       self.server.sendData('customData', periods[key], 0); 
      }, tout); 
      tout = tout + 7000; 
     })(key); 
    } 
} 
+1

Just ... Wow. Это работает. Спасибо, это для меня что-то новое. Не могли бы вы немного объяснить? – ojek

+0

Он использует выражение [немедленно вызываемое выражение] (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression), чтобы создать новую область, передав вашу переменную в качестве параметра. Внутри функции это отдельная переменная, поэтому она не изменяется по мере продвижения цикла. –

Смежные вопросы