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 相关文章推荐
onpropertypchange
Jul 01 Javascript
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
Aug 16 Javascript
为你的网站增加亮点的9款jQuery插件推荐
May 03 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
Jan 11 Javascript
无限循环轮播图之运动框架(原生JS实现)
Oct 01 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 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 xml文件操作实现代码(二)
2009/03/20 PHP
php中常用的预定义变量小结
2012/05/09 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
jQuery之排序组件的深入解析
2013/06/19 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python读取文件名称生成list的方法
2018/04/27 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
英语教育专业自荐信
2014/05/29 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
催款通知书范文
2015/04/17 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
MySQL 服务和数据库管理
2021/11/11 MySQL