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 相关文章推荐
[JS]点出统计器
Oct 11 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
Dec 25 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
vuejs选中当前样式active的实例
Aug 22 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
Python中endswith()函数的基本使用
2015/04/07 Python
利用python发送和接收邮件
2016/09/27 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
Python中按键来获取指定的值
2019/03/02 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
序列化Python对象的方法
2020/08/01 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
思想政治自我鉴定
2013/10/06 职场文书
大专计算机个人求职的自我评价
2013/10/21 职场文书
高二美术教学反思
2014/01/14 职场文书
党的群众路线调研报告
2014/11/03 职场文书
部门2014年度工作总结
2014/11/12 职场文书
风之谷观后感
2015/06/11 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python