jQuery创作和关闭

时间:2011-11-10 03:34:40

标签: javascript jquery

我正在阅读关于写jQuery plugins的内容,有一节讨论保留美元符号表示法,以便它不会与使用它的其他库发生冲突。

它说:

  

将jQuery传递给自执行函数是一种最佳实践   (闭包)将其映射到美元符号,因此不能被覆盖   由执行范围内的另一个库

以下是他们的表现:

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

    // Do your awesome plugin stuff here

  };
})( jQuery );

我正在试图理解他们在说什么以及这段代码在说什么。如何评估以下代码?

执行function($){}并将jQuery对象传递给它吗?

jQuery对象是否成为$?

2 个答案:

答案 0 :(得分:2)

是;使用传递给它的function($) { ... }对象执行jQuery$参数隐藏父作用域的$变量(如果有),并为其赋予jQuery变量的值,但仅限于该代码块。

您希望这样做的原因是$可能会被其他库(例如Prototype)使用,但您仍希望能够使用$速记对于插件中的jQuery。通过创建一个带有$参数并以jQuery作为该参数执行它的函数的函数,您可以在该函数内使用$而不是jQuery而不覆盖{{1在Prototype使用的函数之外。

答案 1 :(得分:2)

可以写成:

function add_my_plugin_to_fn($) {
  $.fn.myPlugin = function() {
  }
}

add_my_plugin_to_fn(jQuery);

//window.jQuery = stuff; // in jquery initializer
function add_my_plugin_to_fn(any_object_with_fn_property) {
      any_object_with_fn_property.fn.myPlugin = function() {
      }
    }

    add_my_plugin_to_fn(jQuery);

所有都会为jQuery的fn.myPlugin属性添加一个函数。我们使用$的唯一原因是因为jQuery人喜欢使用单字母'$'作为函数名。它可以很容易jQuery.fn.mypluginjq.fn.myplugin_.fn.myplugin

这可以让你摆脱出现类似情况的情况

my_awesome_javascipt_.js
    function $(add_to_this) {
      return add_to_this + 1;
    }


jQuery.js

    window.jQuery = //all the jquery stuff
    //sees that window.$ already has a function in it and leaves it alone


my_jquery_plugin.js
  $.fn.myplugin; //this doesn't exist because $ is a function from the first file
  //you should have used jQuery.fn.myplugin. But that is a lot to type out. Doing the 

立即调用函数技巧强制使用具有该文件范围的变量'$'。

是的,语言真的应该为你做。它是一种愚蠢的机制,在全球范围内是默认的。如果你想要修复它的东西,请查看coffeescript,它可以帮助你编写没有很多基本错误的javascript