关闭/范围JavaScript / jQuery

时间:2009-11-24 18:57:48

标签: javascript jquery function scope closures

我正在尝试将一些现有的顶级函数组合在一起 闭包(以避免污染全局命名空间)但我并不完全 让它工作。

首先,所有JS都在我的匿名函数之外工作,但是一旦我放了 它在匿名函数中我得到一个错误“crossfade不是 定义“。有人看到任何完全明显的我是 丢失?

我不太明白为什么setInterval / crossfade在外面工作 匿名函数但不在内部。 start()内的任何内容都应该 能够看到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);

4 个答案:

答案 0 :(得分:8)

使用setInterval('crossfade()', 5000);不会创建闭包 - 它会创建一个字符串eval() d。你应该使用一个函数:

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

答案 1 :(得分:7)

setInterval方法将在窗口范围内运行,因此那里不存在交叉淡化功能。您必须创建一个匿名函数,以便创建一个包含对函数的引用的闭包:

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

答案 2 :(得分:2)

setInterval传递一个字符串时,该字符串将在全局范围内进行评估。这解释了crossfade触发时setInterval不可见的原因。

setInterval也可以传递函数引用:

setInterval(crossfade, 5000);

在这种情况下,您的代码将按预期工作,因为crossfade在您调用setInterval的位置可见。

答案 3 :(得分:1)

为避免污染全局范围,您可以执行以下操作:

  • 扩展jQuery,因为你已经在使用jQuery了。 (使用jQuery作为命名空间。)
  • 创建一个对象来保存您的方法。 (创建自己的命名空间。)