一般看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

js函数前加分号和感叹号是什么意思?有什么用?的更多相关文章

  1. js函数前加分号和感叹号的作用

    js函数前加分号和感叹号是什么意思?有什么用? 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascrip ...

  2. (转)js函数前加分号和感叹号是什么意思?有什么用?

    转载地址:https://www.cnblogs.com/mq0036/p/4605255.html 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuer ...

  3. js文件中函数前加分号和感叹号是什么意思?

    本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}();   !有什么用? 从语法上来开,JavaScri ...

  4. js 前加分号和感叹号是什么意思?

    ;!function(){}();  ;!有什么用? 从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单 ...

  5. js 前加分号和感叹号的含义

    ;!function(){}();  ;!有什么用? 从语法上来开.Javascript中分号表示语句结束,在开头加上.可能是为了压缩的时候和别的方法切割一下,表示一个新的语句開始.所以,假设在一个单 ...

  6. js 函数前的+号

    不知啥时候起,函数的闭包需要增加+才能立即执行了. 不加反而报语法错.orz +function() { console.log("Foo!"); }(); 输出: Foo!< ...

  7. js函数前面的+,!

    +function(){}(); 这里的加号,也可以替换成!,~等其他一元操作符,其效果相当于: (function() { console.log("Foo!"); })(); ...

  8. javascript js函数重名后面的覆盖前面的

    js 函数重名后面的覆盖前面的   var x = 1;    var y = 0;    var z = 0;    function add(n) { return n = n + 1; }    ...

  9. js的调用函数前先执行某语句问题

    js的调用函数前先执行某语句问题 标签: web前端面试 2015-09-29 17:48 1455人阅读 评论(0) 收藏 举报  分类: js(5)  版权声明:本文为博主原创文章,未经博主允许不 ...

随机推荐

  1. 20135319zl内核模块编译报告

    内核模块编程学习报告 1.编写一个简单的输出信息的模块 源代码: Makefile 编译模块 加载模块 测试模块(dmesg) 卸载模块 Sudo rmmod 1 使用dmesg查看情况 2.输出当前 ...

  2. nodejs进程异常退出处理方法

    1. 捕获uncaughtException process.on('uncaughtException', function (err) { //打印出错误 console.log(err); // ...

  3. OS X 安装pyspider

    pyspider安装的过程中,需要安装pycurl.有几个坑 一.首先遇到权限的问题 因为/Library目录是root权限,所以非root用户对该目录的读写经常会遇到权限问题,但是不宜切换成root ...

  4. R语言--时间序列分析步骤

    大白. (1)根据趋势定差分 plot(lostjob,type="b") 查看图像总体趋势,确定如何差分 df1 = diff(lostjob)  d=1阶差分 s4_df1=d ...

  5. 题解【bzoj2653 middle】

    Description 给你一个序列,每次询问给出四个数 \(a,b,c,d\),求所有区间 \([l,r]\) 满足 \(l \in [a,b], r \in [c,d]\) 的中位数的最大值.强制 ...

  6. python基础之赋值/深copy/浅copy

    首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的. 那么,让我们来对那些可变的像list set dict t ...

  7. python中几种常用的数据类型

    1.字典 字典的创建: dict1=dict((('name','PIG'),)),其中第一层()代表里面的内容是dict函数的输入参数.第二层和第三层代表字典中的各元素,也就是key和value组合 ...

  8. Hadoop生态圈-Hbase的API常见操作

    Hadoop生态圈-Hbase的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

  10. Sitemesh 3使用及配置

    1:Sitemesh简介 SiteMesh是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的. SiteMesh是基于Servlet的filter的,即过滤流. ...