js函数前加分号和感叹号是什么意思?有什么用?

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

原文链接:https://www.cnblogs.com/mq0036/p/4605255.html

js函数前加分号和感叹号的作用的更多相关文章

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

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

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

    一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascript组件是这样写的 !function( $ ){ ...

  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. spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析

    转载:http://www.cnblogs.com/jcchoiling/p/6440709.html 一.大数据性能调优的本质 编程的时候发现一个惊人的规律,软件是不存在的!所有编程高手级别的人无论 ...

  2. 2018.9.20 Educational Codeforces Round 51

    蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =.= A.Vasya And Password 一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保 ...

  3. js replace如何实现replaceAll

    js下string对象的replace方法的定义如下: stringObject.replace(regexp/substr,replacement) 其中: 参数             |     ...

  4. (三)论sizeof与strlen之间的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  5. java程序文件读取与保存实例代码

    class RadioHere extends JFrame implements ActionListener { private JTextArea ta=new JTextArea(10,20) ...

  6. Java入门:修改IDE主题颜色

    1.去 http://eclipsecolorthemes.org/?view=theme&id=1下载你需要的颜色,根据id不同,配色方案不一样. 2.下载页面右侧的“Eclipse Pre ...

  7. Mongo副本集搭建

    解压mongodb-linux-x86_64-rhel70-3.2.0.tgz 将解压后的bin路径添加到系统环境变量,保证mongo.mongod等命令可用 创建副本集目录mongo/27017.2 ...

  8. P3007 [USACO11JAN]大陆议会The Continental Cowngress

    P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 "支持或反对某法案&q ...

  9. 有关并查集的emmmm

    并查集 顾名思义,并查集有三个用处 并,即合并两个集合 查,查询该元素所在的集合 集,就指集合 现在来说一说并查集的基本操作: - 初始化 首先,最开始的时候,我们假设所有的集合都只有一个元素,即只有 ...

  10. 类python中高级用法

    1. __call__用法 class Foo: def __init__(self): print('init') def __call__(self, *args, **kwargs): prin ...