Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
闭包/作用域JavaScript/jQuery_Javascript_Jquery_Function_Scope_Closures - Fatal编程技术网

闭包/作用域JavaScript/jQuery

闭包/作用域JavaScript/jQuery,javascript,jquery,function,scope,closures,Javascript,Jquery,Function,Scope,Closures,我试图将一些现有的顶级函数分组到 闭包(以避免污染全局名称空间),但我不太清楚 让它发挥作用 首先,所有的JS都在我的匿名函数之外工作,但是一旦我把 在匿名函数中,我得到一个错误“crossfade不是 定义”。有人看到我是谁吗 失踪 我不太明白为什么setInterval/crossfade在室外工作 匿名函数,但不在内部。start()中的任何内容都应该 能够看到start()之外的变量/函数,应该是 在顶级匿名函数创建的闭包中受保护? 我没有试图访问crossfade()中的任何内容,我只

我试图将一些现有的顶级函数分组到 闭包(以避免污染全局名称空间),但我不太清楚 让它发挥作用

首先,所有的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);是的,我试过了,但是我得到了一个错误,没有用引号调用它。首选的方法是没有引号。你到底收到了什么错误信息?