2009-11-24 4 views
5

Я пытаюсь сгруппировать некоторые функции верхнего уровня внутри закрытия (чтобы избежать загрязнения глобального пространства имен), но я не совсем , чтобы он работал.Закрытие/область действия JavaScript/jQuery

Во-первых, все JS работает вне моей анонимной функции, но как только я положил в анонимную функцию, я получаю сообщение об ошибке «crossfade is not defined». Кто-нибудь видит что-то совершенно очевидное, что я отсутствую ?

Я не совсем понимаю, почему setInterval/crossfade работает вне анонимной функции, но не внутри. Что-нибудь внутри start() должно быть в состоянии видеть vars/функции снаружи start(), и все должно быть защищено в закрытии, созданном анонимной функцией верхнего уровня? Я не пытаюсь получить к нему доступ в пределах crossfade(), я всего лишь , пытаясь его выполнить.

(function($) { 

    //vars up here that internal functions can access 
    //also using some jquery inside here, so using $ 

    function crossfade() { 
     //body here 
    } 

    //other functions 

    function start() { 
     //body here 

     cInterval = setInterval('crossfade()', 5000); 
    } 

})(jQuery); 

ответ

7

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

cInterval = window.setInterval(function() { crossfade(); }, 5000); 
+0

Спасибо, что это работает для меня. –

8

Использование setInterval('crossfade()', 5000); не создает замыкание - это создает строку, чтобы быть eval() d. Вы должны использовать функцию вместо:

setInterval(function() { crossfade(); }, 5000); 
+6

Я бы использовал setInterval (crossfade, 5000); – Nosredna

1

Чтобы избежать загрязнения глобального охвата, вы можете сделать несколько вещей:

  • Продлить JQuery , поскольку вы уже используете jQuery. (Используйте jQuery как пространство имен.)
  • Создайте один объект, чтобы удерживать ваши методы. (Создайте собственное пространство имен.)
2

Когда setInterval передается строка, строка оценивается в глобальной области видимости. Это объясняет, почему crossfade не отображается, когда стреляет setInterval.

setInterval также можно передать ссылку на функцию:

setInterval(crossfade, 5000); 

в этом случае ваш код будет работать, как и следовало ожидать, так как crossfade видна в точке, где вы называете setInterval.

+0

Да, я пробовал это, но я получаю сообщение об ошибке, не вызываемой кавычками. –

+0

Предпочтительный способ - без кавычек. Какое сообщение об ошибке вы получили? – Nosredna

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