Javascript自执行匿名函数(function() { })()的原理浅析


Posted in Javascript onMay 15, 2016

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数

下面是一个最常见的自执行函数:

// 传统匿名函数
(function() {
alert('hello');
})();

这段代码的执行效果就是在页面再载入时弹出:"hello"

是什么促使它自动执行的?,来看下面的代码

// 在传统写法上去掉小括号,并在前面加上运算符 ~,!,+,-
~function(){
alert('hello');
}();
!function(){
alert('hello');
}();
+function(){
alert('hello');
}();
-function(){
alert('hello');
}();

这些写法与上文所说的传统方式执行起来并无区别,

我发现,这些写法的共同点是运算符,其实传统方式的小括号()也属于运算的一种,出现在:a=b*(c+d),

运算符 + 传递给自生的参数 = 函数自动执行?但有些符号也不支持,比如“=,*,/”号,它自执行的原因还是很神秘,网上也找不到像样的答案

然后我发现了一个神奇的现象,这些运算符可以无限叠加。。。。。。

// function前面是特定符号可以无限叠加...
~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~~~~~~~~+-!!!!!!+function a(b) {
alert('hello');
}();

程序正常运行!!!!!!

但是,有两种情况会报错

如果连续出现三个及以上的“+”或“-”符号,则会出错;

如果连续出现两个“+”或“-”符号再接上其他符号,则会出错,例如“++~”,“--+”;

错误提示:Uncaught ReferenceError: Invalid left-hand side expression in prefix operation (意思是左侧表达式错误)

然后我用同样的符号来运算一个变量,发现一模一样,这或许已经可以说明是javascript的运算促使函数的自动执行,也可以理解为通过运算来调用这个函数!

并不是函数自己执行了,而是通过运算来调用这个函数!,但只支持部分运算方式!

此外,这个自执行函数,未必是匿名函数!看上方的代码,我在运算符后的函数中,定义了函数名称a,并没有什么异常,但也没什么卵用- -!,这个a依然无法被其他方法调用,但我觉得很多人都称其为匿名函数有点不妥!

以上所述是小编给大家介绍的Javascript自执行匿名函数(function() { })()的原理浅析,希望对大家有所帮助!

Javascript 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
JavaScript Event学习第八章 事件的顺序
Feb 07 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
JS中script标签defer和async属性的区别详解
Aug 12 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
使用vue-router完成简单导航功能【推荐】
Jun 28 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
js阻止浏览器默认行为的简单实例
May 15 #Javascript
js添加绑定事件的方法
May 15 #Javascript
JavaScript绑定事件监听函数的通用方法
May 14 #Javascript
易被忽视的js事件问题总结
May 14 #Javascript
jQuery防止重复绑定事件的解决方法
May 14 #Javascript
jQuery基于扩展简单实现倒计时功能的方法
May 14 #Javascript
jquery动态切换背景图片的简单实现方法
May 14 #Javascript
You might like
PHP出错界面
2006/10/09 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
javascript 写类方式之五
2009/07/05 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python 将pdf转成图片的方法
2018/04/23 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
建筑公司文秘岗位职责
2013/11/29 职场文书
学生打架检讨书大全
2014/01/23 职场文书
结婚保证书范文
2014/04/29 职场文书
2014年度思想工作总结
2014/11/27 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
创业计划书之家教中心
2019/09/25 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python