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 相关文章推荐
extjs grid取到数据而不显示的解决
Dec 29 Javascript
JQuery Ajax 跨域访问的解决方案
Mar 12 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
全面解析Bootstrap图片轮播效果
Dec 03 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
Jun 21 Javascript
微信小程序  自定义创建详细介绍
Oct 27 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
vue select二级联动第二级默认选中第一个option值的实例
Jan 10 Javascript
layer iframe 设置关闭按钮的方法
Sep 12 Javascript
基于js实现判断浏览器类型代码实例
Jul 17 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中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
Python3基础之条件与循环控制实例解析
2014/08/13 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
python3实现表白神器
2019/04/09 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
计算机专业推荐信范文
2013/11/27 职场文书
给医务人员表扬信
2014/01/12 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
车队司机自我鉴定
2014/03/02 职场文书
副总经理岗位职责
2014/03/16 职场文书
成都人事代理协议书
2014/10/25 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
冰峪沟导游词
2015/02/09 职场文书
学校食堂管理制度
2015/08/04 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python