2013-02-09 3 views
4

Эксперты. Javascript не создает желаемый эффект задержки.
Из других вопросов, на SO, я должен знать, что проблема связана с настройкой и тем, как я ее использую. Но все же я не могу понять, как работает Settimeout. Итак, я помещаю код здесь. Необходимо использовать только Javascript, из-за цели знания.
На самом деле я пытаюсь очистить свои понятия о это, закрытие в javascript. Являются ли они извращенными вещами Javascript?Javascript SetTimeout и петли

var objImg = new Object(); 
var h; 
var w; 

var no = 100; 
while (no != 500) { 
    setTimeout(function() { 
     size(no, no); 
    }, 2000); 

    /* it's get executed once, instead of repeating with while loop 
    Does it leave loop in mid? I get image with 500px height and 
    width, but effect is not acheived. 
    */ 

    no = no + 50; 
} 

function size(h, w) { 
    var objImg = document.getElementsByName('ford').item(0); 
    objImg.style.height = h + 'px'; 
    objImg.style.width = w + 'px'; 
} 
+0

ваш цикл в то время как работает normal.I've протестировали его на хромированной консоли. – Ramin

+0

@ramin omrani - правда? но изображение не изменяется с эффектом задержки 2 сек. Я знаю, что я испортил SetTimeout, но пока не знаю, как его внутренняя работа полностью. – msinfo

ответ

4

У вас есть две проблемы:

  • no будет иметь значение конца цикла, когда функция вызывается
  • вы программируете все ваши таймаутов 2000 мс с тем, время цикла.

Вот как можно исправить:

var t = 0 
while (no != 500) { 
    (function(no) { 
     t += 2000; 
     setTimeout(function() { size(no,no);} ,t); 
    })(no); 
    no = no+50; // could be written no += 50 
} 

Немедленно выполняется функция создает область, которая защищает значение no.


Небольшое пояснение о (function(no) {:

Область действия переменной либо

  • глобальный масштаб
  • функция

Код выше может быть написано как

var t = 0 
while (no != 500) { 
    (function(no2) { 
     t += 2000; 
     setTimeout(function() { size(no2,no2);} ,t); 
    })(no); 
    no += 50; 
} 

Здесь, вероятно, более ясно, что у нас есть две переменные:

  • no, значение которого изменяется с каждой итерации и 500, когда тайм-ауты называются
  • no2, на самом деле одна переменная no2 пер вызов внутренней анонимной функции

Каждый раз, когда вы вызываете внутреннюю анонимную функцию, она объявляет новый no2, значение которого равно no во время вызова (во время итерации). Эта переменная no2, таким образом, защищена и используется обратным вызовом, заданным setTimeout.

+0

Привет @dystroy - пока нет успеха. Ваш код делает браузер неподходящим. – msinfo

+0

@msinfo моя первая версия была неправильной (без увеличения в закрытии). Можете ли вы попробовать последний? –

+0

да, это сработало. Не могли бы вы объяснить, две итерации цикла while и значения t и переменная в этих условиях. Спасибо (со всеми этими изменениями. :-) – msinfo

3

Почему бы просто не использовать setInterval() вместо этого?

var objImg = new Object(); 
var h; 
var w; 

var no = 100; 
var myInterval = window.setInterval(function() { 
    size(no, no); 
    no = no + 50; 
    if (no >= 500) clearInterval(myInterval); 
}, 2000); 

function size(h, w) { 
    var objImg = document.getElementsByName('ford').item(0); 
    objImg.style.height = h + 'px'; 
    objImg.style.width = w + 'px'; 
} 
+0

он он он :-) он работает на твоем пути. На самом деле я написал выше тестовый код, чтобы проверить свои знания о настройке и других вещах, и здесь я узнал, что это можно сделать. Было бы обозначать это как ответ, как только кто-то объяснит, что случилось с настройкой в ​​моем коде. Благодарю. – msinfo

+0

Ваш код не работает так, как вы думаете, потому что вы думаете, что каждый setTimeout() будет вызван, как только время пройдет от предыдущего setTimeout(). Но это не так. Все эти setTimeout() будут вызваны сразу же в одно и то же время. – daleyjem

+0

О! Понимаю, правда, я думал о том, как вы разобрались. Но упс! поскольку @dystroy дал решение с опцией settimeout, и он несколько раз редактировал свой ответ, чтобы сообщить мне. Я принимаю его ответ и голосую за вас. – msinfo

0

Ваша проблема с синтаксисом функции размера() & алгоритм:

var objImg = new Object(); 
var h; 
var w; 

var no = 100; 

var int = window.setInterval(function() { 
    size(no,no); 
    no += 50; 
},2000) 

function size(h, w) { 
    if (h == 500){ 
     window.clearInterval(int); 
     return; 
    } 
    var height = h + 'px'; 
    var width = w + 'px'; 
    document.getElementsByName('ford').item(0).style.height = height; 
    document.getElementsByName('ford').item(0).style.width = width; 
} 

http://jsfiddle.net/AQtNY/2/

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