【问题标题】:Why need to pass jQuery object as parameter to closure? [duplicate]为什么需要将 jQuery 对象作为参数传递给闭包? [复制]
【发布时间】:2013-09-05 12:32:47
【问题描述】:

为了避免 JavaScript 代码中的全局变量,我多次看到人们使用这种结构:

(function($) {
    // here code
    // here code
})(jQuery);

所以我有疑问:为什么我们需要将函数参数声明为 $ 以及为什么我们需要将 jQuery 对象作为参数传递?

【问题讨论】:

  • 如果您在其他代码段中使用$ 来表示不是 jQuery 的东西会怎样?
  • 这和Clojure有什么关系?你的意思是“关闭”吗?

标签: javascript jquery


【解决方案1】:

您不必这样做。您可以随意命名函数参数。这只是使用 jQuery 的人的常见/最佳实践,因为使用 $ 作为 jQuery 库对象的别名很常见。

您应该这样做的原因是因为有其他库使用 $ 作为其库对象的别名。需要避免与这些库发生冲突,因为函数闭包将确保 $ 成为包装函数内的 jQuery 对象。

这是一个例子:

(function (myJqueryAlias) {
     console.log(myJqueryAlias('document') === jQuery('document'));
})(jQuery);

【讨论】:

  • 我对$了如指掌。你应该阅读我的更新答案
  • 你的 === 测试永远不会通过 - 每次调用时,jQuery 都会为 $('document') 创建一个全新的对象,每次都会有不同的引用。
  • $ 已经由 jQuery 定义并不重要,除非您 100% 确定 $ 永远不会被其他库或您的代码覆盖。
  • @Juno 我可以在这个闭包中访问 jQuery 的 $ 对象吗?如果可以的话,这意味着在访问$时将jQuery对象作为参数传递只避免冲突
  • 如果要使用 $,只需将参数命名为 $。
【解决方案2】:

有了这个你归档在这个块中你仍然有 $ 作为 jQuery 并且你仍然可以写像 "$("selector")" 而不是 "jQuery("selector")" 的东西。 在这个块之外,变量 $ 仍然是它应该是的(例如,您使用另一个也使用 $ 的 JSLib)

【讨论】:

  • 即在闭包内我无权访问$ 变量?或者将jQuery 明确传递为$ 的唯一原因是避免冲突?
  • @MyTitle 是的,当在此函数之外调用 jQuery.noConflict() 时,您无权访问 $。更多信息请见api.jquery.com/jQuery.noConflict
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多