javascript setTimeout и компилятор закрытия Google

У меня есть несколько операторов setTimeout, и после того, как я запускаю свой код через компилятор закрытия, они, похоже, не работают. У меня есть 3 вида этих утверждений:

1) Вызовите функцию:

setTimeout("MyFunctionName()", 3000);

2) jQuery

setTimeout("$('#MyDiv').find('.MyClass').addClass('TheNewClass');", 1000);

3) Настройка глобальной переменной

setTimeout("MyGlobalVar = 2;", 2000);

Как лучше всего оптимизировать такой код?

Спасибо за ваши предложения.


person frenchie    schedule 07.03.2012    source источник


Ответы (2)


Компилятор закрытия переименовывает ваши функции и переменные, поэтому ваш код ломается. В качестве решения используйте анонимную функцию, подобную следующей, чтобы эти вызовы также переименовывались.

1)

setTimeout( function() { MyFunctionName(); }, 3000);

или (как упоминалось jfriend00), если у вашей функции нет аргументов:

setTimeout( MyFunctionName, 3000);

2)

setTimeout( function() { $('#MyDiv').find('.MyClass').addClass('TheNewClass'); }, 1000);

3)

setTimeout( function(){ MyGlobalVar = 2; }, 2000);

Что касается (2), я не уверен, что это единственная причина, по которой ваш код ломается.

person Sirko    schedule 07.03.2012
comment
Первый элемент может быть просто: setTimeout( MyFunctionName, 3000);. В этом случае анонимная функция не нужна. - person jfriend00; 07.03.2012
comment
Просто оставил его на месте, чтобы охватить более общий случай, когда присутствуют параметры. - person Sirko; 07.03.2012
comment
в случае 2 иногда у меня есть логическое значение в качестве параметра. Я оставлю это как есть? - person frenchie; 07.03.2012
comment
@frenchie, если вы используете анонимную функцию, вы в любом случае на стороне сохранения. - person Sirko; 07.03.2012

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

Есть много причин не использовать eval, включая тот факт, что Closure Compiler не может "видеть" код, спрятанный в строках.

person josh3736    schedule 07.03.2012