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 相关文章推荐
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
jQuery实现友好的轮播图片特效
Jan 12 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
AngularJS 模块详解及简单实例
Jul 28 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
JS前端加密算法示例
Dec 22 Javascript
Angular中$state.go页面跳转并传递参数的方法
May 09 Javascript
基于vue 动态加载图片src的解决方法
Feb 05 Javascript
VSCode中如何利用d.ts文件进行js智能提示
Apr 13 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python读取word文本操作详解
2018/01/22 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
Python 从attribute到property详解
2020/03/05 Python
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
幼儿园见习报告范文
2014/10/30 职场文书
以权谋私检举信范文
2015/03/02 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书