!function($)意味着什么?

时间:2013-07-02 09:25:10

标签: jquery plugins

我对jquery插件有一些疑问 - bootstrap-popover.js。

  1. !function($){//意思是什么?
  2. 有些行没有分号和逗号,为什么?
  3. }(window.jQuery); //意思是什么?

  4. !function ($) { //<--- 1. what does this line mean?
    
          "use strict"; // jshint ;_;
    
          var Popover = function (element, options) {
    
            this.init('popover', element, options) //<-- 2. this line has no semicolon, why...?
    
          }
    
          Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
            ..................................
          })
    
    
          var old = $.fn.popover
    
          $.fn.popover = function (option) {
            return this.each(function () {
    
              var $this = $(this)
                , data = $this.data('popover')
                , options = typeof option == 'object' && option
    
              if (!data) $this.data('popover', (data = new Popover(this, options)))
    
              if (typeof option == 'string') data[option]() // <-- 3. this line has no semicolon no comma, why...?
    
            })
    
          }
        .......................................
    
        }(window.jQuery); // <-- 4. what does this line mean?
    

2 个答案:

答案 0 :(得分:3)

!function ($) {...}(window.jQuery);相当于 (function ($) {...})(window.jQuery);(function ($) {...})(window.jQuery);具有相同的行为。

这是一个IIFE,自我调用函数:http://en.wikipedia.org/wiki/Immediately-invoked_function_expression

(window.jQuery)是传递给匿名函数的参数,这是将$置于函数内部,指的是作为参数传递的jQuery版本。

忘了告诉分号。在ECMAScript之后,分号是可选的,javascript引擎足够聪明,可以在缺失时添加它们。但是,作为旁注,有一个特殊的行为:

以下代码将始终返回'undefined':

return
        1;

在这种情况下,当检测到新行并且引擎不知道返回什么时,将在return语句和值之间添加分号,给出:

return ;1;

所以使用:return 1;之间没有换行。当然,return 1也会有效。

答案 1 :(得分:0)

在Javascript / EMCA脚本中,函数是可以传递,匿名调用或只是普通使用的值。

因此,例如,以下内容非常好。

var square_something = function(x) { return x * x; };
alert(square_something(5));

更进一步,我们可以做一些事情,比如

alert(function(x) { return x * x; }(5));

也就是说,使用值5

调用(或调用)(匿名)函数

Javascript / ECMA脚本的另一个很棒的功能是字符“$”是一个完全有效的变量名。所以我可以做到

var $ = 5;
alert ($);

我会看到价值5非常好。与其他Javascript库一样,jQuery库广泛使用它。还是......

var myFunc = function($) { alert($ + 10); }
myFunc(32); // should alert the number 42

在jQuery扩展中,您经常会看到这种模式......

function($) {
  // all the extension code...
}(window.jQuery);

也就是说,使用值window.jQuery调用匿名函数。他们这样做是因为其他Javascript库使用变量$而不是变量window.jQuery。这是一种非常微妙的方式,可以在任何地方使用非常简短且快速的$代替window.jQuery,仅在定义的函数范围内。

回答你的“没有分号问题”......你提到的那条线上没有分号,因为那里不需要。但是,如果你有另一条线,则需要它。