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 相关文章推荐
Prototype Number对象 学习
Jul 19 Javascript
js面向对象之静态方法和静态属性实例分析
Jan 10 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
jQuery基础知识点总结(必看)
May 31 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
Mar 29 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
Apr 16 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
JavaScript根据json生成html表格的示例代码
Oct 24 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
深入理解 TypeScript Reflect Metadata
Dec 12 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的Reflection反射机制
2014/08/05 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
怎样声明一个匿名的内部类
2016/06/01 面试题
Unix里面如何在后台运行程序
2016/10/14 面试题
父亲追悼会答谢词
2014/01/17 职场文书
《悯农》教学反思
2014/04/28 职场文书
公司年底活动方案
2014/08/17 职场文书
学习十八大的心得体会
2014/09/12 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
资料员岗位职责
2015/02/10 职场文书
小学语文教学随笔
2015/08/14 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
浅谈MySQL user权限表
2021/06/18 MySQL