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 相关文章推荐
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
JavaScript在多浏览器下for循环的使用方法
Nov 07 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
底部悬浮通栏可以关闭广告位的实现方法
Jun 01 Javascript
Angular如何引入第三方库的方法详解
Jul 13 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
javascript验证form表单数据的案例详解
Mar 25 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
Vue通过provide inject实现组件通信
Sep 03 Javascript
JavaScript中遍历的十种方法总结
Dec 15 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目录与文件操作
2011/12/30 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
php实现的xml操作类
2016/01/15 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
语义化 H1 标签
2008/01/14 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
Json解析的方法小结
2016/06/22 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
详解Angular5 服务端渲染实战
2018/01/04 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
Python学习资料
2007/02/08 Python
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python 实现自动导入缺失的库
2019/10/29 Python
详解Python实现进度条的4种方式
2020/01/15 Python
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
学校运动会广播稿100条
2014/09/14 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
vue特效之翻牌动画
2022/04/20 Vue.js