0

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

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

!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?
4

2 回答 2

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 引擎足够聪明地在缺少时添加它们。但是,作为旁注,有一种特殊的行为:

以下代码将始终返回“未定义”:

return
        1;

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

return ;1;

所以使用:return 1;在它之间没有新线。return 1当然也可以。

于 2013-07-02T09:26:53.777 回答
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 非常好。jQuery 库和其他 Javascript 库一样广泛使用了这一点。或者...

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,仅在定义的函数范围内。

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

于 2013-07-02T09:36:47.907 回答