我正在尝试将一些现有的顶级函数组合在一起 闭包(以避免污染全局命名空间)但我并不完全 让它工作。
首先,所有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);
答案 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)
为避免污染全局范围,您可以执行以下操作: