javascript - 如何调用嵌套在 JQuery 插件中的函数?

标签 javascript jquery jquery-plugins closures

我的目标是能够调用我的 JQuery 插件中的函数。

正确的语法是什么?

例如,这不起作用:

<a href="#" id="click_me">Click Me</a>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
(function($) { 
    $.fn.foo = function(options) {
        do_stuff = function(){
            console.log("hello world!"); // works
            do_other_stuff = function(){
            alert("who are you?");
            }
        } // function
    } // function
})(jQuery);

$("body").foo();

$("#click_me").click(function(){
$.fn.foo.do_stuff.do_other_stuff(); // doesn't work
});

</script>

最佳答案

当您将函数分配给不带 var 关键字的变量时,它们要么覆盖该名称的局部变量,要么被添加到全局命名空间中。 (所以你的 do_stuff 是一个全局函数,这不是你想要的)

做您想做的事情的一种方法是明确给出您希望函数驻留的位置。

(function($) { 
    $.fn.foo = function(options) {
        // whatever $().foo() should do
    };

    $.fn.foo.do_stuff = function() {
        console.log("hello world!");
    };

    $.fn.foo.do_stuff.do_other_stuff = function(){
        alert("who are you?");
    };
})(jQuery);

编辑:

之所以可行,是因为 javascript 中的所有函数都是对象,这意味着您可以为任意属性赋值。

如果你想访问其他函数的变量,你可以将定义移动到其他函数中,比如:

$.fn.foo.do_stuff = function() {
    console.log("hello world!");
    $.fn.foo.do_stuff.do_other_stuff = function(){
        alert("who are you?");
    };
};

但这意味着该函数仅在您运行另一个函数时才定义,并且每次运行该函数时它都会覆盖最后一个定义。

可能更理想的解决方案是让每个函数返回一个包含嵌套函数的对象,如下所示:

(function($) { 
    $.fn.foo = function(options) {
        // whatever $().foo() should do

        var do_stuff = function(do_stuff_args) {
            console.log("hello world!");
            // do stuff with options and do_stuff_args

            var do_other_stuff = function(other_args) {
                alert("who are you?");
                // here you have access to options, do_stuff_args, and other_args
            };

            return {
                do_other_stuff: do_other_stuff
            };
        };

        return {
            do_stuff: do_stuff
        }
    };
})(jQuery);

并使用

调用它
foo().do_stuff(some_options).do_other_stuff(other_options);

var a = foo(stuff).do_stuff(some_options);
a.do_other_stuff(foo);
a.do_other_stuff(bar);

关于javascript - 如何调用嵌套在 JQuery 插件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1042072/

相关文章:

javascript - 如何统一js文件,什么时候是关于jQuery插件

javascript - 使用 twitter bootstrap scroll spy

javascript - 如何使用 Meteor Template Helper 增加和显示变量计数器?

javascript - 无法填充第二个选择语句

javascript - 如何向此代码添加 "add"按钮?

javascript - jquery滑动菜单,默认折叠所有菜单

javascript - Simple JSZip - 从现有图像创建 Zip 文件

javascript - 从点创建数组

javascript - 我需要一个 JQuery IP Mask 插件

javascript - jQuery jqClock 插件选项