js函数前加分号和感叹号的作用
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
原文链接:https://www.cnblogs.com/mq0036/p/4605255.html
js函数前加分号和感叹号的作用的更多相关文章
- (转)js函数前加分号和感叹号是什么意思?有什么用?
转载地址:https://www.cnblogs.com/mq0036/p/4605255.html 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuer ...
- js函数前加分号和感叹号是什么意思?有什么用?
一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascript组件是这样写的 !function( $ ){ ...
- js文件中函数前加分号和感叹号是什么意思?
本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}(); !有什么用? 从语法上来开,JavaScri ...
- js 前加分号和感叹号是什么意思?
;!function(){}(); ;!有什么用? 从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单 ...
- js 前加分号和感叹号的含义
;!function(){}(); ;!有什么用? 从语法上来开.Javascript中分号表示语句结束,在开头加上.可能是为了压缩的时候和别的方法切割一下,表示一个新的语句開始.所以,假设在一个单 ...
- js 函数前的+号
不知啥时候起,函数的闭包需要增加+才能立即执行了. 不加反而报语法错.orz +function() { console.log("Foo!"); }(); 输出: Foo!< ...
- js函数前面的+,!
+function(){}(); 这里的加号,也可以替换成!,~等其他一元操作符,其效果相当于: (function() { console.log("Foo!"); })(); ...
- javascript js函数重名后面的覆盖前面的
js 函数重名后面的覆盖前面的 var x = 1; var y = 0; var z = 0; function add(n) { return n = n + 1; } ...
- js的调用函数前先执行某语句问题
js的调用函数前先执行某语句问题 标签: web前端面试 2015-09-29 17:48 1455人阅读 评论(0) 收藏 举报 分类: js(5) 版权声明:本文为博主原创文章,未经博主允许不 ...
随机推荐
- 构建工具-----Gradle(二)-----myeclipse 10和myeclipse2015安装gradle插件----其他版本的myeclipse类似
我们需要给myeclipse安装gradle的插件.这样myeclipse就能识别到gradle项目了,直接加载进去即可. 我们先安装配置系统命令行的gradle,挺简单的,下载后配置环境变量即可,详 ...
- PostgreSQL 修改字段类型从int到bigint
由于现在pg的版本,修改int到bigint仍然需要rewrite表,会导致表阻塞,无法使用.但可以考虑其他方式来做.此问题是排查现网pg使用序列的情况时遇到的. 由于int的最大值只有21亿左右,而 ...
- HDU--4705
题目: Y 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 分析:树形dp的思想,枚举中间点. #include<iostream> ...
- UnityShader 序列帧动画效果
实现原理:主要思想是设置显示uv纹理的大小,并逐帧修改图片的uv坐标. 实现步骤 1.我们首先用_Time.y和速度属性_Speed相乘得到模拟的时间. 2.然后我们用time除以_Horizonta ...
- RCNN,fast R-CNN,faster R-CNN
转自:https://www.cnblogs.com/skyfsm/p/6806246.html object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别. ...
- tomcat 性能检测
一.jconsole 1.tomcat在windows上,start方式启动 在catalina.bat 文件中的:doRun和:doStart下添加以下代码 (没有换行) set JAVA_OPTS ...
- newcoder Wannafly挑战赛4 树的距离
https://www.nowcoder.com/acm/contest/35/D 假设要查询x的子树中,与x的距离>=y的距离和 那么如果有这么一个 由x的子树中的点到x的距离构成的序列,且按 ...
- 逻辑控制之While循环控制器(While Controller)
测试环境 apache-jmeter-3.0 1. 添加While Controller 右键线程组->添加->逻辑控制器->响应断言 2. 控制面板介绍 添加后,面板如下 ...
- shell的父子进程
2017年1月11日, 星期三 shell的父子进程 启动/执行方式: 当前shell: #!/bin/bash 必须行首 ...
- 一、Kafka初认识
一.kafka使用背景 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我 ...