Javascript 方法未定义

Javascript 方法未定义,javascript,jquery,Javascript,Jquery,我犯了一个错误 (function($){ $.fn.slideshow = function(){ function init(obj){ setInterval("startShow()", 3000); } function startShow(){ alert('h'); } return thi

我犯了一个错误

(function($){
    $.fn.slideshow = function(){

        function init(obj){

            setInterval("startShow()", 3000);           
        }               

        function startShow(){
            alert('h');
        }
        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);
改变

将字符串传递给setInterval时,其中的代码在当前范围之外执行。无论如何,只传递函数更合适。如果不使用括号,函数可以像任何其他变量一样传递

如果需要传递变量,可以使用类似以下的解决方案:

这将创建一个匿名函数作为setInterval的第一个参数传递,在该匿名函数中,您可以访问作用域链更上层的变量和函数。

更改

startShow is not defined

将字符串传递给setInterval时,其中的代码在当前范围之外执行。无论如何,只传递函数更合适。如果不使用括号,函数可以像任何其他变量一样传递

如果需要传递变量,可以使用类似以下的解决方案:

这将创建一个匿名函数作为setInterval的第一个参数传递,在该匿名函数中,您可以访问作用域链上的变量和函数。

startShow函数是作用域的局部函数,因此当setInterval方法计算全局作用域中的字符串时,它找不到函数

使用匿名函数而不是字符串:

setInterval(function () { startShow(myVar); }, 3000);
由于匿名函数使用本地声明的函数,因此会创建一个闭包,以便该函数仍然可以访问它。

startShow函数是作用域的本地函数,因此当setInterval方法在全局作用域中计算字符串时,它将找不到该函数

setInterval(function(){ startShow(); }, 3000);
使用匿名函数而不是字符串:

setInterval(function () { startShow(myVar); }, 3000);

当匿名函数使用本地声明的函数时,会创建一个闭包,以便该函数仍然可以访问它。

将字符串传递给setInterval/setTimeout会使它在后台运行eval。函数作用域在此评估中丢失,需要全局引用。避免在setInterval/setTimeout中使用字符串,因为它从来都不需要,而且会导致误用

setInterval(function(){ startShow(); }, 3000);
 function startShow()
 {
        alert('h');
 }    
(function($){
        $.fn.slideshow = function(){

            function init(obj){

                setInterval("startShow()", 3000);           
            }               


            return this.each(function(){                    
                init(this);
            });

        }
    })(jQuery);

将字符串传递给setInterval/setTimeout会使其在后台运行eval。函数作用域在此评估中丢失,需要全局引用。避免在setInterval/setTimeout中使用字符串,因为它从来都不需要,而且会导致误用

 function startShow()
 {
        alert('h');
 }    
(function($){
        $.fn.slideshow = function(){

            function init(obj){

                setInterval("startShow()", 3000);           
            }               


            return this.each(function(){                    
                init(this);
            });

        }
    })(jQuery);

如果将超时设置为在基本作用域中查找,则需要在

请尝试以下操作:

(function($){
    $.fn.slideshow = function(){

        var init = function(obj){
            setInterval(startShow, 3000);           
        }               

        var startShow = function(){
            alert('h');
        }

        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);
或者,您可以创建一个对象来保存您的方法:

(function($){
    $.fn.slideshow = function(){

        function init(obj){

            setInterval(function(){
                startShow();
            }, 3000);           
        }

        function startShow(){
           //Deprecated 
        }


        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);

如果将超时设置为在基本作用域中查找,则需要在

请尝试以下操作:

(function($){
    $.fn.slideshow = function(){

        var init = function(obj){
            setInterval(startShow, 3000);           
        }               

        var startShow = function(){
            alert('h');
        }

        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);
或者,您可以创建一个对象来保存您的方法:

(function($){
    $.fn.slideshow = function(){

        function init(obj){

            setInterval(function(){
                startShow();
            }, 3000);           
        }

        function startShow(){
           //Deprecated 
        }


        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);

这与您的问题没有直接关系,但是如果您查看此页面,您会注意到创建插件方法时的最佳实践:

这只是一个例子:

(function($){
    $.fn.slideshow = function(){

        var Functions = {
            startShow : function(obj)
            {
                alert('Starting Show')
            }
        }

        function init(obj){

            setInterval(function(){
                 Functions.startShow(obj)
            }, 3000);           
        }

        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);

这与您的问题没有直接关系,但是如果您查看此页面,您会注意到创建插件方法时的最佳实践:

这只是一个例子:

(function($){
    $.fn.slideshow = function(){

        var Functions = {
            startShow : function(obj)
            {
                alert('Starting Show')
            }
        }

        function init(obj){

            setInterval(function(){
                 Functions.startShow(obj)
            }, 3000);           
        }

        return this.each(function(){                    
            init(this);
        });

    }
})(jQuery);

为什么所有的额外代码;编辑:看看他的代码,你可能对最终的结果是正确的,+1代表远见捕获。为什么会有这么多额外的代码;编辑:看看他的代码,你可能对最终的结果是正确的,+1代表远见。是的,我只是复制并粘贴了我的一个答案-那么我如何将obj/var传递给startShow?是的,我只是复制并粘贴了我的一个答案-那么我如何将obj/var传递给startShow?解释!=执行,顺序不是这里的问题,它都围绕着将其称为字符串,您的答案并没有真正解决为什么会这样:解释!=执行,顺序不是这里的问题,它都围绕着把它称为一个字符串,你的答案并没有真正解决为什么会这样:为什么你要把startShow放在全局范围内?糟透了!这与目的背道而驰——他试图将其封装在插件中,而不是所有东西都可以访问。问题是他引用了startShow。。。简单的解决方案。为什么要将startShow纳入全球范围?糟透了!这与目的背道而驰——他试图将其封装在插件中,而不是所有东西都可以访问。问题是他引用了startShow。。。简单的修复。