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 在网页中的运用(asp.net)
Nov 23 Javascript
IE和firefox浏览器的event事件兼容性汇总
Dec 06 Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
一些主流JS框架中DOMReady事件的实现小结
Feb 12 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
Jul 09 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
JavaScript实现拖拽效果
Mar 16 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
YB217、YB235、YB400浅听
2021/03/02 无线电
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
好的Python培训机构应该具备哪些条件
2018/05/23 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Python数据库小程序源代码
2019/09/15 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
《穷人》教学反思
2014/04/08 职场文书
品质口号大全
2014/06/17 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers