js自执行函数的几种不同写法的比较


Posted in Javascript onAugust 16, 2012

经常需要一个函数自执行,可惜这一种写法是错的:

function(){alert(1);}();

原因是前半段“function(){alert(1);}”被当成了函数声明,而不是一个函数表达式,从而让后面的“();”变得孤立,产生语法错。

按上面的分析,这一段代码虽说没有语法错,但也是不符合我们的预期的,因为这个函数并没有自执行。

function(){alert(1);}(1);

综上,症结在于,如何明确代码描述的是一个函数表达式,而不是函数声明语句。
正确的写法多种多样,也各有利弊:

方法1:最前最后加括号

(function(){alert(1);}());

这是jslint推荐的写法,好处是,能提醒阅读代码的人,这段代码是一个整体。
例如,在有语法高亮匹配功能的编辑器里,光标在第一个左括号后时,最后一个右括号也会高亮,看代码的人一眼就可以看到这个整体。
不过,对于某些写代码不喜欢在行后加分号的同学,也会形成一些坑坑,例如以下代码会报运行错:
var a=1 
(function(){alert(1);}());

方法2:function外面加括号

(function(){alert(1);})();

这种做法比方法1少了一个代码整体性的好处。

方法3:function前面加运算符,常见的是!与void 。

!function(){alert(1);}(); 
void function(){alert(2);}();

显然,加上“!”或“+”等运算符,写起来是最简单的。
加上“void ”要敲五下键盘,但是听说有一个好处是,比加"!"少一次逻辑运算。----我只是听说,不明所以。

最后,代表我个人,强烈支持方法1,即jslint的推荐写法:

(function(){alert(1);}());
Javascript 相关文章推荐
javascript 学习之旅 (1)
Feb 05 Javascript
jQuery 性能优化指南(2)
May 21 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
Mar 05 Javascript
jquery无法设置checkbox选中即没有变成选中状态
Mar 27 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
js实现省级联动(数据结构优化)
Jul 17 Javascript
js实现幻灯片轮播图
Aug 14 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
js三种排序算法分享
Aug 16 #Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 #Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 #Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 #Javascript
You might like
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
如何使用php输出时间格式
2013/08/31 PHP
php的dl函数用法实例
2014/11/06 PHP
php购物车实现方法
2015/01/03 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
BootStrap中
2016/12/10 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
老生常谈js数据类型
2017/08/03 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
Python正则表达式介绍
2012/08/06 Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
Python之web模板应用
2017/12/26 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书