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

时间: 2024-10-25 05:20:17

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

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

本文转自:http://blog.csdn.net/h_o_w_e/article/details/51388500 !function(){}();   !有什么用? 从语法上来开,JavaScript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单独的JS文件中,开头的分号是没有任何意义的,可以删掉. 叹号是逻辑运算符,是"非"的意思,常见这种写法 if(!true){}:而将运算符加载函数定义的前面,则是将函数看做一

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

;!function(){}();  ;!有什么用? 从语法上来开.Javascript中分号表示语句结束,在开头加上.可能是为了压缩的时候和别的方法切割一下,表示一个新的语句開始.所以,假设在一个单独的JS文件里.开头的分号是没有不论什么意义的,能够删掉. 叹号是逻辑运算符,是"非"的意思,常见这样的写法 if(!true){}.而将运算符载入函数定义的前面,则是将函数看做一个总体.然后再调用这个函数.并对返回的结构进行逻辑运算. 说白了,此处就是构建了一个马上运行函数,建议楼主知道

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

;!function(){}();  ;!有什么用? 从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单独的JS文件中,开头的分号是没有任何意义的,可以删掉. 叹号是逻辑运算符,是“非”的意思,常见这种写法 if(!true){}:而将运算符加载函数定义的前面,则是将函数看做一个整体,然后再调用这个函数,并对返回的结构进行逻辑运算. 说白了,此处就是构建了一个立即执行函数,建议楼主知道意思就可以,自己

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

函数声明方式有两种: 1, function demo(){} //声明式定义函数 2, var demo=function(){} //函数赋值表达式定义函数 我们通常这样调用函数 demo(). 但如果我们为一个"定义函数"末尾加上(),解析器是无法理解的. 如果将函数体部分用()包裹起来就可以运行并且解析器是不报错的: (function() {})() //调用匿名函数 但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用 !func

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

js 函数重名后面的覆盖前面的   var x = 1;    var y = 0;    var z = 0;    function add(n) { return n = n + 1; }    function add(b) { return b = b + 5; } y = add(1);    z = add(3);    alert(y + z); 结果为:14

js实现填写身份证号、手机号、准考证号等信息自动空格的效果

咱们做网站的,用户体验那是相当重要的,比如12306抢票需要填写身份证,如果不空格,密密麻麻的给我一种很压抑的感觉,而且也不容易核对信息是否填写正确,所以我就写了一个利用Js实现填写身份证号.手机号.准考证号等信息自动空格的效果. 为了方便,自已定义的一个简单的get()方法和trim()方法,代码如下: //获取对应的对象--function函数. function get(id) { return document.getElementById(id); } //去掉所有空格--String

如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何编写高质量的 JS 函数(1) -- 敲山震虎篇>介绍了函数的执行机制,此篇将会从函数的命名.注释和鲁棒性方面,阐述如何通过 JavaScript 编写高质量的函数. <如何编写高质量的 JS 函数(2)-- 命名/注释/鲁棒篇>从函数的命名.注释和鲁棒性方面,阐述如何通过 JavaScri

JS函数大全 莫名其妙找到的

1 .document.write(""); 输出语句 2 .JS中的注释为// 3 .传统的HTML文档顺序是:document->html->(head,body) 4 .一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5 .得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6 .

一个奇怪的JS函数

今天在分析一个jQuery插件源码的时候,发现了一个奇怪的函数. // add leading zeros var pad = function(x){return (1e15+""+x).slice(-2)}; 首先1e15是什么意思? 也不是十六进制表示法. 不管三七21,直接F12打开命令窗口,执行下看看,结果是1后面有15个0. 原来1e15是科学计数法,表示1乘以10的15次方. var y=123e5; // 12300000 var z=123e-5; // 0.0012