需要帮助理解Twitter Bootstraps插件(jQuery)

7
我得到了除一行代码之外的所有插件代码,由于搜索引擎的工作方式,我实际上无法搜索我的问题。
问题是这是什么鬼东西:
(!function($) {/*....*/})(jQuery);

为什么要写 !functions($)?我猜是为了达到与 $.noConflict() 相同的效果,但我们使用 (function($) {/*...*/})(jQuery); 不正是把美元符号包裹在函数块里吗?我完全意识到我的想法可能完全错误,我在 jQuery/js 中仍然处于中级水平。
如果有人能告诉我在函数声明前 NOT 操作符的作用,我将非常感激。
编辑:看来我忽视了 bootstrap 没有 (!function($) ... ) 的事实,而只是 !function($)... ,但你们帮助我意识到它只是 () 的另一种形式。

@LightnessRacesinOrbit 是的,看看这个 http://twitter.github.com/bootstrap/assets/js/bootstrap-tooltip.js - dhazelett
谷歌搜索“JavaScript感叹号函数定义”的第一个结果是... - Lightness Races in Orbit
可能是函数前的感叹号有什么作用?的重复问题。 - Lightness Races in Orbit
似乎没有意义,因为无论如何都要使用 () - Lightness Races in Orbit
我真是个蠢货...我甚至没想到要把它完整地写出来...谢谢您! - dhazelett
在JavaScript中,function和function()之间有什么优势? - Lightness Races in Orbit
1个回答

4
这里有几个要点。所有内容都被包裹在一个立即执行的匿名函数中,这是为了为库创建一个作用域,以便作者声明函数和变量时,默认情况下它们不是全局的。
现在明白了吗?接下来是整个 ($){...}(jQuery) 的事情。这里的作者将 jQuery 库作为参数传递到匿名包装函数中,命名为 $。因此,在匿名函数的作用域内,他可以使用 $ 来引用 jQuery,就像你期望的那样。这更多地是一种最佳实践,因为99%的时间 jQuery 已经在全局范围内定义为 $,但是在函数作用域内引用全局变量被认为是不好的形式,因此他/她将其作为参数传递。
还在吗?感叹号: JavaScript 中有一条规则,规定程序的第一行必须是表达式(即不是函数声明,也不是语句)。通过在声明前加上!,作者将声明转换为表达式(返回 false)。然而,在这种情况下,我认为实际上并不需要!,因为声明被包裹在()中并立即执行。(函数调用是一个表达式)

确实,这已经是一个表达式了;! 是多余的。它是将声明用括号包裹的_替代方案_,但作者出于某种原因两者都使用了。当你谈论程序的第一行时,我不知道你指的是什么;确实,我相信绝大多数 JavaScript 脚本都以语句开头。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接