Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Я нашел скрытый бонус JavaScript (https://javascript.ru/forum/misc/17549-ya-nashel-skrytyjj-bonus-javascript.html)

Solovei95 24.05.2011 10:20

Я нашел скрытый бонус JavaScript
 
for(i=0;i<3;i++){

window.setTimeout(function(i){
alert("test"+i);
},1000,i);

}


т.е. параметр i обязателен!

Solovei95 24.05.2011 10:24

Аналогично
window.addEventListener("load",function(i){
alert("test"+i);
}(i),false);

Sweet 24.05.2011 10:46

Цитата:

Сообщение от Solovei95
Аналогично

Абсолютно не аналогично. А насчет SetTimeout - тут ie все обламывает, так же, как и, например, это:
test = true,
function(x){
  var test = x;
  eval.call(window, "alert(test)");
}(false); // скрытый бонус)))

Solovei95 24.05.2011 11:33

Только этот бонус не работает, как цикл находиться внутри функции

Sweet 24.05.2011 11:52

Цитата:

Сообщение от Solovei95
Только этот бонус не работает, как цикл находиться внутри функции

Что, простите?:)

Solovei95 24.05.2011 12:22

Я уже решил проблему!

monolithed 24.05.2011 13:14

Цитата:

Сообщение от Sweet
скрытый бонус

по-моему так проще:
test = true,
function(x) {
  var test = x;
  alert(window.test);
}(0);

:)

Sweet 24.05.2011 13:53

monolithed, мне просто вспомнилось, как когда-то мне надо было эвалить ( я был молод, горяч и любил эвалить:D ) скрипты. Но так как эвал происходит в текущем контексте, переменные оказывались не там, где надо:
(function(){
  eval("var test = true;");
}());
alert("test" in window);
Тогда я решил проблему так:
(function(){
  eval.call(window, 'var test = true;');
}());
alert("test" in window);
А потом я неожиданно узнал, что в ie так не получится. Тогда мне помог execScript, но с тех пор я понял: нашел "скрытый бонус", первым делом опробуй его в ie!:)

FINoM 24.05.2011 17:55

Цитата:

Сообщение от Solovei95 (Сообщение 105882)
for(i=0;i<3;i++){

window.setTimeout(function(i){
alert("test"+i);
},1000,i);

}

А что этот пример возвращает в консоли? Не могу понять.


Кстати, в setTimeout можно передавать больше одного аргумента.

Sweet 24.05.2011 18:24

Цитата:

Сообщение от FINoM
А что этот пример возвращает в консоли?

Идентификаторы timeout-ов наверное.
Цитата:

Сообщение от FINoM
в setTimeout можно передавать больше одного аргумента.

Если это имеет значение, несмотря на некроссбраузерность, то проверить не проблема:
setTimeout(function(){
  alert( arguments.length );
}, 1, 1, 2, 3);


Часовой пояс GMT +3, время: 19:37.