转自:http://blog.csdn.net/hongmin118/article/details/4584023

我们在一些JS代码中经常可以看到这样的用法 :
(function(){})();
那这些括号是做什么用的呢?
下面我们来测试一下就知道了

(function(){alert('zol');});
运行后,没有反映(相当于第一函数)

(function(){alert('zol');})();
运行后,弹出 zol

(function(){alert('zol');})(alert('wiki'));
运行后,先弹出wiki,再弹出zol

(function(){alert('zol');})(alert('wiki'););
出错,什么也不运行。

我们从第二个可以看出,第一个括号中的匿名函数执行了,说明第二个括号是用于执行操作,这和我们调用函数的用法一样,比如定义了一个function a(){};我们调用a这个函数是 a();那么a就和这个例子中的第一个括号代表的意思相同,是一个函数体,只是没有名字,我们也叫他匿名函数。
第三个代码中先弹wiki,说明alert('wiki')是先执行,这个是做为第一个括号的函数的参数来运行了,如果给参数后加分号,当然就出错了,所以第四个代码就不运行了。

==================华丽的分隔符========================================

转自:http://segmentfault.com/q/1010000000117476

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

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

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

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

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

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

function fnA(){alert('msg');}//定义函数
var fnB = function(){alert('msg');}//匿名函数

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

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

function msg(){
alert('message');
}();//解析器是无法理解的

定义函数的调用方式应该是 msg() ; 那为什么将函数体部分用()包裹起来就可以了呢?

原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。

另外,用 ! 可能更多的是一个习惯问题,不同的运算符,性能是不同的。

这些有一篇非常详细的文章,推荐阅读:http://www.swordair.com/blog/2011/10/...

JS中括号的用法的更多相关文章

  1. js事件监听器用法实例详解

    这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...

  2. js事件监听器用法实例详解-注册与注销监听封装

    本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分析如下: 1.当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的onclick事 ...

  3. JS的简单用法

    JS的简单用法 参考:http://www.w3school.com.cn/js/js_switch.asp JavaScript 是网络的脚本语言 JavaScript 是可插入 HTML 页面的编 ...

  4. JS和jQuery用法区别

    目录 JS和jQuery用法区别 外观区别 查找元素 操作标签 操作内容 操作属性 操作位置 操作样式 事件 JS和jQuery用法区别 外观区别 jQuery与JS最直观的区别就是外观上jQuery ...

  5. JS定时器的用法及示例

    JS定时器的用法及示例 目录 js 定时器的四个方法 示例一 示例二 示例三 js 定时器的四个方法 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函 ...

  6. json对象数组的创建、遍历、添加、删除、修改、js的splice()用法

    本文链接:https://blog.csdn.net/houfengfei668/article/details/79843625 )第二种方式:手动构造json对象数组 )for )用splice方 ...

  7. 转 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...

  8. js中replace用法

    js中replace的用法 replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则 ...

  9. 前端之js的常用用法

    js生成标签 // 将标签添加到i1里面 var tag = document.createElement('input'); tag.setAttribute('type', 'text'); ta ...

随机推荐

  1. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  2. MAC OS 10.11.1虚拟机免费下载已安装Xcode7图片后有下载地址

    MAC OS 10.11.1虚拟机免费下载已安装Xcode7图片后有下载地址 注意:已经下载过MAC OS 10.10.5虚拟机免费下载(可安装Xcode7)链接:http://www.cnblogs ...

  3. [BZOJ4338][BJOI2015]糖果(扩展Lucas)

    先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解. 但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于 ...

  4. java-银行卡基本信息查询

    用于验证的请求接口: https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo= ...

  5. bzoj 2002 LinkCutTree

    我的第一道LCT题(居然1A,O(∩_∩)O哈哈~) 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 大概题意: 给一颗有根树,维护每个 ...

  6. HDU 4183

    给出一个有向图,以及src和dst.判断是否存在从src到dst的两条路径,使得除了src和dst外,没有其它点同时属于两条路径. 给每个点一个为1的点容量(src和dst为2),边的容量也是1,然后 ...

  7. PAT甲级1018. Public Bike Management

    PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...

  8. MariaDB 10 (MySQL DB) 多主复制并实现读写分离

    ----本文大纲 简介 资源配置 拓扑图 实现过程 ==================== 一.简介 MMM 即Master-Master Replication Manager for MySQL ...

  9. 数组、Set对象的互相转换

    一.数组与Set对象之间的转换可以实现数组的去重(数组可重复,Set不可重复) 1. 把数组对象转换为Set对象 var arr = [1,2,3,4,5,6,7,6,6,7]; console.lo ...

  10. 感觉比较好一些的vultr中文网

    搜索一波vultr的中文网,发现很多,基本上都是靠活动以及一些SS的教程维持,全都是大同小异,感觉比较有可比性估计一下这个: https://www.thevultr.org/ 可以对比一些美国常用V ...