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

https://www.cnblogs.com/mq0036/p/4605255.html

一般看JQuery插件里的写法是这样的

(function($) {//... 

})(jQuery);

今天看到bootstrap的javascript组件是这样写的

!function( $ ){//...}(window.jQuery );

为什么要在前面加一个 " ! " 呢?


我们都知道,函数的声明方式有这两种

functionfnA(){alert('msg');}//声明式定义函数var fnB =function(){alert('msg');}//函数赋值表达式定义函数

楼主问题中出现的两个函数,都是匿名函数。通常,我们调用一个方法的方式就是 FunctionName()

但是,如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。

functionmsg(){  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字节。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,700评论 0 3
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,068评论 2 17
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,747评论 0 6
  • 大B哥:即刻行动,塑造完美身材 每个女人烦恼的事情都大致相同,并且每个女人都尝试过很多方法去解决这些棘手的问题(几...
    B哥教你玩健身阅读 2,804评论 0 2
  • 今天是正月十五元宵节,收到了很多元宵节的祝福,也祝大家元宵节快乐。 早上4:50起床听家人们上课。七点钟进了千里跟...
    思_a860阅读 151评论 0 0

友情链接更多精彩内容