一般看 JQuery 插件里的写法是这样的
(function($) {
//...
})(jQuery);
今天看到 bootstrap 的 javascript 组件是这样写的
!function( $ ){
//...
}( window.jQuery );
为什么要在前面加一个 "!" 呢?
我们都知道, 函数的声明方式有这两种
function fnA(){alert('msg');}// 声明式定义函数
var fnB =
function(){alert('msg');}// 函数赋值表达式定义函数
楼主问题中出现的两个函数, 都是匿名函数. 通常, 我们调用一个方法的方式就是 FunctionName()
但是, 如果我们尝试为一个 "定义函数" 末尾加上 (), 解析器是无法理解的.
function msg(){
alert('message');
}();// 解析器是无法理解的
定义函数的调用方式应该是 msg() ;
如果将函数体部分用 () 包裹起来就可以运行并且解析器是不报错的, 如:
(function($) {
//...
})(jQuery);
那为什么将函数体部分用 () 包裹起来就可以了呢?
原来, 使用括号包裹定义函数体, 解析器将会以函数表达式的方式去调用定义函数. 也就是说, 任何能将函数变成一个函数表达式的作法, 都可以使解析器正确的调用定义函数. 而 ! 就是其中一个, 而 + - || 都有这样的功能.
另外, 用 ! 可能更多的是一个习惯问题, 不同的运算符, 性能是不同的.
这些有一篇非常详细的文章, 推荐阅读: http://www.swordair.com/blog/2011/10/ ...
就是为了能省略一个字符......
// 这么写会报错, 因为这是一个函数定义:
function() {}()
// 常见的 (多了一对括号), 调用匿名函数:
(function() {})()
// 但在前面加上一个布尔运算符 (只多了一个感叹号), 就是表达式了, 将执行后面的代码, 也就合法实现调用
!function() {}()
在前面加上~+- 等一元操作符也可以.. 其实还有好几种符合都可以保证匿名函数声明完就立即执行
var hi = function(){ alert("hi") };
hi();
等于...
(function(){ alert("hi") })();
!,+ 和 () 一样的效果可以把换成
!function(){ alert("hi") }();
! 比 () 节省一个字符, 或者说比 () 好看些
我们都知道分号是为了和前面的代码隔开, js 可以用换行分隔代码, 但是合并压缩多个 js 文件之后, 换行符一般会被删掉, 所以连在一起可能会出错, 加上分号就保险了.
你看到的感叹号, 一般是在压缩过的 js 文件里面, 因为在匿名函数调用的时候, 通常我们都是用: (function(){})() 的形式, 但也可以使用另一种形式:!function(){}() 前面的! 号可以换成 -+~ 等等一元操作符, 从而省下了 1 字节.
出处参考:
http://segmentfault.com/q/1010000000117476
http://zhidao.baidu.com/link?url=TZRm5eIm5YT6CPEb-w9i0NiplFRH19kwfkJ6HCjsTY863Ty2w2Uburgx1OCBjvhxNqYxpDUfkUNts2A_72st-npOmvO5phokO88ksVWdRBu
来源: http://blog.csdn.net/qq814965130/article/details/79216422