Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.09.2010, 10:43
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Отложенные вычисления в JavaScript
Ещё одна серия статей, на этот раз про отложенные вычисления. Описал, правда, не всё, что хотел, пара паттернов у самого ещё не уложились в голове.

В процессе написания сделал для себя небольшое (а может даже большое) открытие.

Цитата:
IE устанавливает таймер на следующий запуск после выполнения callback-функции, а остальные браузеры — до. Поэтому, например, анимация, реализованная с помощью setInterval в Internet Explorer всегда будет медленнее, чем в других браузерах.
Ответить с цитированием
  #2 (permalink)  
Старый 24.09.2010, 12:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,085

мысли в слух ...
Цитата:
function f() {
var a = 1;
setTimeout('alert(a)', 2000); // Через две секунды будет ошибка,
// т.к. a не определена в глобальной области видимости.
}
но можно веть так написать
function f() {
    var a = 1;
    setTimeout('alert('+a+')', 2000);
}
f();

и тогда ошибки не будет.
Ответить с цитированием
  #3 (permalink)  
Старый 24.09.2010, 12:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Можно, если только a -- значение примитивного типа.
Ответить с цитированием
  #4 (permalink)  
Старый 24.09.2010, 12:04
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

http://alljs.ru/articles/timeout/overview.html
Сообщение от Kolyaj
setTimeout(function() {…}, 1); // Ставим минимально возможный интервал
Минимально возможный интервал — 0. Код ставится в очередь, и выполнится по окончанию блока <script> (или каскада событий и обработчиков событий, в общем, «потока»).

Вот тестовый пример, который работает идентично во всех браузерах, включая престарелый IE6
<a href="javascript:writeLog('click default action')" id="test">Клицк ми!</a>
<pre id="log"></pre>
<script>
	setTimeout(function(){
		writeLog("Log started"); /* а функция-то еще не определена! */
	}, 0)
	writeLog = function(str){
		document.getElementById('log').innerHTML += str + "<br />";
	};
	test = document.getElementById("test");
	test.onclick = function(){
		writeLog('click event handler');
		setTimeout(function(){
			writeLog('timeout at click');
		}, 0)
	}
	test.onmouseup = function(){
		writeLog('mouseup event handler');
		setTimeout(function(){
			writeLog('timeout at mouseup');
		}, 0)
	}
</script>


А в IE setTimeout(…, 1) рискует превратиться в setTimeout(…, 18.2) из-за квантов таймера.
Ответить с цитированием
  #5 (permalink)  
Старый 24.09.2010, 12:14
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

subzey,
http://alljs.ru/articles/timeout/fast-settimeout.html

В первом тесте меняю
setTimeout(arguments.callee, 1);
на
setTimeout(arguments.callee, 0);
Показания не изменяются.
Ответить с цитированием
  #6 (permalink)  
Старый 24.09.2010, 12:28
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Хм, похоже на то.

Кстати, спасибо за эту тему, побенчмаркал Оперу 10.6 (Win) и получил странные результаты
var startTime = (new Date).getTime();
	var i=0;
	(function(){
		if (++i>100){
			alert((new Date).getTime() - startTime);
		} else {
			setTimeout(arguments.callee, 1E-80);
		};
	})()

Работает значительно быстрее, чем
var startTime = (new Date).getTime();
	var i=0;
	(function(){
		if (++i>100){
			alert((new Date).getTime() - startTime);
		} else {
			setTimeout(arguments.callee, 0);
		};
	})()


Подтвердите, или опревергните, плз.
Ответить с цитированием
  #7 (permalink)  
Старый 24.09.2010, 12:32
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

setZeroTimeout всё равно быстрее
Ответить с цитированием
  #8 (permalink)  
Старый 24.09.2010, 13:15
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

setTimeout(function (a, b, c) { alert([a, b, c]); }, 10, "A", "B", "C")

Наверное, поэтому и не стали в других браузерах передавать числовой параметр, равный количеству миллисекунд, на которые запоздал вызов функции.
Ответить с цитированием
  #9 (permalink)  
Старый 24.09.2010, 13:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Octane,
вобщем использовать это нельзя Хотя упомянуть стоит.
Ответить с цитированием
  #10 (permalink)  
Старый 24.09.2010, 19:56
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

По поводу передачи контекста и параметров в callback'и: можно добавить два отдельных метода в прототип функции, один для указания контекста, второй для передачи параметров. Например,
foo.of(this).pass(1, 2).defer(100);

вместо
foo.defer(100, this, [1, 2]);

В результате не надо помнить порядок аргументов (по сути получаем именованные аргументы) и не надо пихать эти ctx, args во все остальные функции. Да и просто, у defer как-то многовато обязанностей иначе


По поводу
(function() {
    // Выполняем периодические действия

    setTimeout(arguments.callee, 500);
})();

можно добавить еще один метод, например, periodical и писать как-нибудь вроде
onTimer.periodical(500)();

Как передать в onTimer информацию - см. выше. Помимо вынесения "служебного" кода, передаваемые переменные будут явно обозначены (в отличие от варианта с замыканием)


Сообщение от Kolyaj
пара паттернов у самого ещё не уложились в голове
а что за паттерны?


offtopic: код выглядит контрастно на фоне основного текста...

Последний раз редактировалось x-yuri, 24.09.2010 в 19:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Другой взгляд на javascript Дубров Олег Javascript под браузер 24 27.05.2017 09:15
Москва, ищу JavaScript программиста отлично знающего ExtJS, от 10 USD / час. maximgb Работа 3 03.08.2010 14:34
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24
Программист на JavaScript (удалённо) Vadym Работа 1 28.01.2009 13:57
Нужен Старший разработчик JavaScript Yandex Работа 17 19.08.2008 16:43