闭包/作用域 JavaScript/jQuery

5

我正在尝试将一些现有的顶级函数分组到一个闭包中(以避免污染全局命名空间),但我似乎无法使其正常工作。

首先,所有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个回答

8

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

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

6
我会使用 setInterval(crossfade,5000);。 - Nosredna

7

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

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

2

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

setInterval还可以传递函数引用:

setInterval(crossfade, 5000);

如果您在调用setInterval时,crossfade可见,则您的代码将按预期工作。


是的,我尝试了这个,但是报错说没有用引号调用它。 - magenta placenta
首选方式是不带引号。你确切地收到了什么错误信息? - Nosredna

1
为了避免污染全局作用域,你可以做一些事情:
  • 扩展jQuery,因为你已经在使用jQuery。(使用jQuery作为命名空间.)
  • 创建一个单独的对象来保存你的方法。(创建自己的命名空间.)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接