What does !function ($) { $(function(){ }) }(window.jQuery) do?
我正在使用twitter bootstrap创建一个站点,并试图初始化工具提示。 除了在application.js中添加类似:
1 | $("[rel=tooltip]").tooltip() |
之外,除非我保留,在bootstrap文档中使用以下代码,我的工具提示不会初始化。
1 2 3 4 5 6 7 | !function ($) { $(function(){ }) }(window.jQuery) |
上面的代码是做什么的?
让我们解释一下破解代码
1 2 | function () { }() |
或者经常写成
1 2 | (function () { })() |
是
在解释封装的匿名函数语法中阅读更多相关内容。
匿名函数是一个强大的功能,并且具有诸如范围("变量名称间距")之类的好处,请参阅javascript中自执行函数的用途是什么?
现在他们正在使用
1 2 3 | function ($) { }(window.jQuery) |
我们暂时跳过
所以他们将
这样做是为了使
因此,使用
另一个好处是
1 2 3 | $(function(){ }) |
它是你可能已经知道的jQuery的文档就绪块,它确保此函数内的代码将在
更多信息,请访问http://api.jquery.com/ready/
那个
简而言之:
为了证明
1 2 3 4 5 6 7 8 | (function() { alert('first'); }()) (function() { alert('second'); }()) |
如果您在
1 | TypeError: undefined is not a function |
为什么会这样?让我们模拟JS引擎如何执行上面的代码块。它执行此匿名函数
1 | (undefined)(undefined) |
因为它的语法就像一个
When you use !, the function becomes the single operand of the unary
(logical) NOT operator.This forces the function to be evaluated as an expression, which
allows it to be invoked immediately inline.
这解决了上面的问题,我们可以用
1 2 3 4 5 6 7 8 | !(function() { alert('first'); }()) !(function() { alert('second'); }()) |
对于您的情况,您可以简单地将工具提示代码放在文档就绪块中
1 2 3 | $(function(){ $("[rel=tooltip]").tooltip(); }); |
它会工作正常。
如果你只使用
没有
1 2 3 4 5 6 7 8 9 10 11 12 13 | . . . <script type="text/javascript"> $("[rel=tooltip]").tooltip(); . . . . Something Something Something |
作为浏览器,按顺序解释标记,它将在面对它时立即执行js代码。当它在这里执行JS块时,它尚未解析
因此,对于上述情况,
1 2 3 | $(function){ // put all your JS code here }); |
希望这一切现在对你有意义。