I';我已经开始使用这个JavaScript模式。有什么问题吗?

I';我已经开始使用这个JavaScript模式。有什么问题吗?,javascript,Javascript,我已经开始在JavaScript中使用这种模式。我不确定我是否读过这篇文章,或者我只是有一天虚构出来的 格式是 var name = (function() { var init = function() { // Init something $('a').click(show); }; var show = function() { // Show something }; $(init); })();

我已经开始在JavaScript中使用这种模式。我不确定我是否读过这篇文章,或者我只是有一天虚构出来的

格式是

var name = (function() {

    var init = function() {
       // Init something
       $('a').click(show);
    };

    var show = function() {
       // Show something
    };

    $(init);

})();
这是一个真实世界的例子

var contactForm = (function() {
    var init = function() {

         if ( ! $('body').hasClass('contact')) {
            return;
         };

         var form = $('.contact #content form');

         form.validate({
              rules: {
                  'full-name': {
                      required: true
                  },    
                  'email': {
                      required: true,
                      email: true
                  },    
              },
              messages: {
                  'email': {
                      email: 'Please make sure this email is valid.'
                  }

          }
          }); 

    };

    $(init);

})();

这有什么问题吗?

没有。我实际上做了几乎相同的事情,但是为什么你要调用
$(init)
,而不是只调用
init()

没有。我实际上把它称为模块模式,并在他们的许多代码中使用它

您甚至可以在匿名函数中执行以下操作

name = new init();

看起来像是作为IIFE(立即调用的函数表达式)编写的jQuery插件。您实际上不需要
var name=
(额外的全局变量),在
$.noConflict()
的情况下,传入jQuery对象是最佳做法。有关这一点和其他有趣的信息,请参见本·阿尔曼的演讲

(function($) {

    var init = function() {
       // Init something
       $('a').click(show);
    };

    var show = function() {
       // Show something
    };

    $(init);

})(jQuery);

因为我正在使用jQuery,并且希望它在DOM ready.Ah上启动。我习惯于做一些不同的事情,并假设您将在一个
$(function(){})
调用中包装多个块。我真丢脸。(续)既然您没有从函数返回任何东西(并且您立即调用它),为什么要使用变量(名称、contactForm)?为什么不完全跳过这一部分呢?还是作为你的书签?@Gaby,这样我就可以清楚地看到每个函数的作用,并且有助于调试。我猜它们可能是注释,但我的堆栈跟踪将显示一些未命名的函数。