闭包/作用域JavaScript/jQuery
我试图将一些现有的顶级函数分组到 闭包(以避免污染全局名称空间),但我不太清楚 让它发挥作用 首先,所有的JS都在我的匿名函数之外工作,但是一旦我把 在匿名函数中,我得到一个错误“crossfade不是 定义”。有人看到我是谁吗 失踪 我不太明白为什么setInterval/crossfade在室外工作 匿名函数,但不在内部。start()中的任何内容都应该 能够看到start()之外的变量/函数,应该是 在顶级匿名函数创建的闭包中受保护? 我没有试图访问crossfade()中的任何内容,我只是 试图执行它闭包/作用域JavaScript/jQuery,javascript,jquery,function,scope,closures,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);
使用setInterval('crossfade()',5000)代码>不创建闭包-它创建了一个字符串eval()
d。您应该改用函数:
setInterval(function() { crossfade(); }, 5000);
setInterval
方法将在窗口范围内运行,因此crossfade函数不存在。您必须创建匿名函数,以便创建包含对该函数的引用的闭包:
cInterval = window.setInterval(function() { crossfade(); }, 5000);
为了避免污染全球范围,您可以做以下几件事:
- 扩展jQuery,因为您已经在使用jQuery。(使用jQuery作为名称空间。)
- 创建一个对象来保存方法。(创建自己的命名空间。)
当setInterval
被传递一个字符串时,该字符串将在全局范围内计算。这就解释了当setInterval
触发时,crossfade
不可见的原因
setInterval
也可以传递函数引用:
setInterval(crossfade, 5000);
在这种情况下,您的代码将按预期工作,因为crossfade
在您调用setInterval
的位置可见,我将使用setInterval(crossfade,5000);是的,我试过了,但是我得到了一个错误,没有用引号调用它。首选的方法是没有引号。你到底收到了什么错误信息?