2012-07-25 20 views
2

这里是JavaScript的一个常见的做法:JavaScript风格:我应该将哪些东西作为参数传递给我的命名空间函数?

(function($) { 
    ...code... 
})(jQuery); 

我理解的包装函数(它可以防止全局命名空间的污染),但许多库(如jQuery,下划线等)已经定义了短名称($_)分别在全球范围内供我使用。我不知道这种方法的优点是什么。只需要将jQuery重命名为更短的内容?防止我覆盖$?以后更容易换入另一个图书馆吗?我想这些都不是真的令我信服。

而且,我也看到了这一点:

(function(_) { 
    ...code... 
})(_); 

即使没有这里重命名。我已经看到:

(function(global) { 
    ...code... 
})(this); // or window, perhaps 

直接使用window有什么问题?

因此,这里是我要问:

  • 请问这种做法有名字吗?
  • 这种做法有什么优点?
  • 我是否应该总是传递我正在使用的库,而不是直接使用它们?
  • 我是否应该通过thiswindow作为全球范围的参考?
+0

为什么你列出的理由似乎没有说服力?你真的需要多少说服力?这只是一个简单的函数调用,需要很少的成本。 – 2012-07-25 02:14:30

+0

他们似乎不*真的*令人信服,因为这些原因都与我的小项目无关。重命名为更短的东西?已经有'$'。防止我覆盖'$'?不是我曾经做过的事情。之后在另一个图书馆交换?直接替换库通常使用相同的名称来为程序员解决这个问题。 ......从防守编码的角度来看,所有这些都可能有优势。 – Calvin 2012-07-25 02:46:30

回答

0

这种做法是否有名字?

该语法被称为自执行匿名函数。我不知道将全局对象传递给函数的任何特殊名称。

这种做法的优点是什么?在函数中

  • 如您所知,var作用域变量将 帮助解除杂波全球namepace。
  • jQuery例子在插件典型地使用,使得该插件可以利用$同时用$.noConflict()(docs)

    (function($) { 
        ...code... 
    })(jQuery); 
    
  • 一般而言剩余兼容,传递全局或保留对象(如windowdocument)作为参数可以帮助缩小缩小后脚本的大小:

    (function(window, document) { 
        // A JS minifier can now minify the all occurrences of `window` and 
        // `document` within this function. 
    })(window, document); 
    

我是否应该总是传入我正在使用的库中,而不是直接使用它们?
我应该通过这个还是作为全局范围的参考?

仅当缩小或冲突的库变量名称是一个问题时。

0

这种做法的优点是什么?

如果变量(“_”,‘$’等),后来被一些其他的代码重写,你的代码将继续按预期工作。它将使用包装函数调用时传入的值。

我是否应该总是传递我正在使用的库而不是直接使用它们?

不,但如果您对上述有任何疑虑,这可能是一个很好的做法。另外,如果您查看AMD加载程序(如Require.js),您会发现这是一种熟悉的技术,因为它们执行类似的操作来定义模块的需求。

我是否应该在这个窗口或窗口中引用全局范围?

this的优点是,代码将运行在任何有全局作用域的地方。例如,如果您的代码可能运行在Node.js服务器上,则不存在window

相关问题