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 相关文章推荐
juqery 学习之五 文档处理 包裹、替换、删除、复制
Feb 11 Javascript
js读取注册表的键值示例
Sep 25 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 Javascript
Angularjs cookie 操作实例详解
Sep 27 Javascript
Node.js log4js日志管理详解
Jul 31 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 Javascript
vue绑定class的三种方法
Dec 24 Vue.js
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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
python算法表示概念扫盲教程
2017/04/13 Python
Python  Django 母版和继承解析
2019/08/09 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
python实现udp传输图片功能
2020/03/20 Python
师说教学反思
2014/02/07 职场文书
工地质量标语
2014/06/12 职场文书
中层干部培训方案
2014/06/16 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
保护校园环境倡议书
2015/04/28 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
使用scrapy实现增量式爬取方式
2022/06/21 Python