setTimeout внутри анонимной функции - PullRequest
1 голос
/ 07 января 2011

Я хочу вызвать editObject () внутри моей функции jQuery, вызов инициализации работает, но setTimeout не работает, как его запустить?Консоль говорит, что editObject не определяется при вызове setTimeout:

(function($){
    $.fn.extend({

                    ...

                    editObject()

            function editObject() {
                alert("Test!");
                setTimeout('editObject()', 1000);
            }

            return this.each(function() {
                var o = options;
            });
        }
    });
})(jQuery);

Спасибо за помощь!

Ответы [ 5 ]

8 голосов
/ 07 января 2011

Это не работает, потому что editObject () объявлен в области действия вашей анонимной функции, но setTimeout () удаляет строку, которую вы передали, в глобальном контексте.Попробуйте это:

setTimeout(editObject, 1000);
5 голосов
/ 07 января 2011

Вы можете попробовать это:

setTimeout(function(){ editObject.call() }, 1000);

Или:

setTimeout(arguments.callee, 1000);
2 голосов
/ 07 января 2011

Вам следует избегать использования строковой версии setTimeout.

. Я считаю, что в этом случае Javascript ищет функцию window.editObject, а ее нет.Вместо этого вы должны использовать:

setTimeout(editObject,1000);

, так как это захватывает ссылку на объект во время вызова, и поэтому функция будет доступна Javascript для вызова по истечении времени ожидания

1 голос
/ 07 января 2011

Используйте ссылку на функцию напрямую (а не строку, которая оценивается в глобальном контексте), например:

setTimeout(editObject, 1000);
0 голосов
/ 07 января 2011

ОБНОВЛЕНИЕ: Я, конечно, неправильно понял проблему, мой оригинальный код отредактирован для работы:

var foo = function () {
    var that = this;
    that.editObject = function() {
      alert('Test');
      setTimeout(that.editObject, 1000);
    }
}
new foo().editObject();

...

Всякий раз, когда движок Javascript будет пытатьсявызовите "editObject ()", определенный в вашей функции jQuery, он выходит за рамки вашей функции jQuery, он фактически находится в глобальной области видимости, но ваша функция editObject () определена в вашей функции jQuery.

Вы можетесоздайте editObject в глобальной области видимости или создайте ссылку на вашу функцию jQuery и передайте ее в вызове setTimeout, например:

var that = this;
that.editObject = function() {
  alert('Test');
  setTimeout(that.editObject(), 1000);
}
...