JavaScript中立即执行函数实例详解


Posted in Javascript onNovember 04, 2017

前言

js立即执行函数可以让你的函数在创建后立即执行,js立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行。

( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此。

下面话不多说了,来一起看看详细的介绍吧。

通常我们声明一个函数有以下几种方式:

// 声明函数f1
function f1() {
 console.log("f1");
}
// 通过()来调用此函数
f1();


//一个匿名函数的函数表达式,被赋值给变量f2:
var f2 = function() {
 console.log("f2");
}
//通过()来调用此函数
f2();


//一个命名为f3的函数的函数表达式(这里的函数名可以随意命名,可以不必和变量f3重名),被赋值给变量f3:
var f3 = function f3() {
 console.log("f3");
}
//通过()来调用此函数
f3();

如果你看过一些自定义控件的话你会发现他们大多数都是沿用这种写法:

(function() {
 ```
 // 这里开始写功能需求
 })();

这是我们常说的立即执行函数(IIFE),顾名思义,也就是说这个函数是立即执行函数体的,不需要你额外去主动的去调用,一般情况下我们只对匿名函数使用IIFE,这么做有两个目的:

     一是不必为函数命名,避免了污染全局变量

     二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

如果看到这两句话无法理解,那么先从IIFE的运行原理说起。

因为IIFE通常用于匿名函数,这里就用简单的匿名函数作为栗子:

var f = function(){
 console.log("f");
}
f();

我们发现这里f只是这个匿名函数的一个引用变量,那么既然f()能够调用这个函数,我把f替换成函数本身可以么:

function(){
 console.log("f"); 
}();

运行之后得到如下结果:

Uncaught SyntaxError: Unexpected token (

产生这个错误的原因是,Javascript引擎看到function关键字之后,认为后面跟的是函数声明语句,不应该以圆括号结尾。解决方法就是让引擎知道,圆括号前面的部分不是函数定义语句,而是一个表达式,可以对此进行运算,这里区分一下函数声明和函数表达式:

1、函数声明(即我们通常使用function x(){}来声明一个函数)

function myFunction () { /* logic here */ }

2、函数表达式(类似以这种的形式)

var myFunction = function () { /* logic here */ };
var myObj = {
 myFunction: function () { /* logic here */ }
};

小学我们就学过用()括起来的表达式会先执行,就像下面这样:

1+(2+3) //这里先运行小括号里面的内容没有意见撒

其实在javascript中小括号也有相似的作用,Javascript引擎看到function关键字会认为是函数声明语句,那么如果Javascript引擎优先看到小括号会怎么样:

//用小括号把函数包裹起来
(function(){
  console.log("f");  
})();

函数成功执行了:

f //控制台输出

这种情况下Javascript引擎就会认为这是一个表达式,而不是函数声明,当然要让Javascript引擎认为这是一个表达式的方法还有很多:

!function(){}();
+function(){}();
-function(){}();
~function(){}();
new function(){ /* code */ }
new function(){ /* code */ }() // 只有传递参数时,才需要最后那个圆括号。
……

回到前面的问题,为什么说IIFE这种形式避免了污染全局变量,如果你见过别人写的jquery插件,里面通常会有类似这样的代码:

(function($){
  ```
  //插件实现代码
})(jQuery);

这里的jquery其实是该匿名函数的参数,联想一下我们调用匿名函数时候是用f()那么匿名带参数的就是f(args)对吧,这里把jquery作为参数传入该函数,那么在函数内部使用形参$的时候就不会影响到外部环境,因为有些插件也会用到$这个限定符,你在这个函数内部可以随意折腾。

以上,在此过程中参考了以下两篇文章:

javascript立即执行某个函数:插件中function(){}()再思考

JavaScript中的立即执行函数

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
一个不错的应用,用于提交获取文章内容,不推荐用
Mar 03 Javascript
ajax无刷新动态调用股票信息(改良版)
Nov 01 Javascript
js关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
仿百度输入框智能提示的js代码
Aug 22 Javascript
关闭浏览器时提示onbeforeunload事件
Dec 25 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
Mar 22 Javascript
第六章之辅组类与响应式工具
Apr 25 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
Jun 09 Javascript
深入理解vue.js中的v-if和v-show
Jun 22 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
Jul 23 Javascript
php register_shutdown_function函数详解
Jul 23 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
Vue全家桶实践项目总结(推荐)
Nov 04 #Javascript
浅谈Vuex的状态管理(全家桶)
Nov 04 #Javascript
简述Angular 5 快速入门
Nov 04 #Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 #Javascript
vue中使用localstorage来存储页面信息
Nov 04 #Javascript
javascript+jQuery实现360开机时间显示效果
Nov 03 #jQuery
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 #Javascript
You might like
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
计算机科学系职业生涯规划书
2014/03/08 职场文书
实习报告怎么写
2019/06/20 职场文书
Python+pyaudio实现音频控制示例详解
2022/07/23 Python