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 相关文章推荐
JS 获取select(多选下拉)中所选值的示例代码
Aug 02 Javascript
在Node.js中实现文件复制的方法和实例
Jun 05 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
微信小程序开发之入门实例教程篇
Mar 07 Javascript
深入理解Angular.JS中的Scope继承
Jun 04 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 Javascript
使用Vue实现移动端左滑删除效果附源码
May 16 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
js html实现计算器功能
2018/11/13 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
python 排列组合之itertools
2013/03/20 Python
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Python如何定义有默认参数的函数
2020/08/10 Python
python 实现汉诺塔游戏
2020/11/28 Python
python 实现有道翻译功能
2021/02/26 Python
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
白宫黑市官网:White House Black Market
2016/11/17 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
销售经理工作职责范文
2013/12/03 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL