我对jquery插件有一些疑问 - bootstrap-popover.js。
!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?
答案 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,仅在定义的函数范围内。
回答你的“没有分号问题”......你提到的那条线上没有分号,因为那里不需要。但是,如果你有另一条线,则需要它。