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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
用于判断用户注册时,密码强度的JS代码
Jan 01 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
Sep 09 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
Jun 20 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
Aug 19 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
jQuery中绑定事件bind() on() live() one()的异同
Feb 23 Javascript
webpack实用小功能介绍
Jan 02 Javascript
使用layer弹窗和layui表单实现新增功能
Aug 09 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
php实现简单的上传进度条
2015/11/17 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python读取中文txt文本的方法
2018/04/12 Python
python读取xlsx的方法
2018/12/25 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
python实现操作文件(文件夹)
2019/10/31 Python
枚举与#define宏的区别
2014/04/30 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
个人简历自我鉴定
2013/10/11 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
大学生创业计划书
2014/08/14 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
详解Nginx 工作原理
2021/03/31 Servers
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
react如何快速设置文件路径别名
2021/04/28 Javascript
Python 中 Shutil 模块详情
2021/11/11 Python