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 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
Oct 11 Javascript
探讨JavaScript标签位置的存放与功能有无关系
Jan 15 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
Vue数据驱动模拟实现1
Jan 11 Javascript
mui上拉加载功能实例详解
Apr 13 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
javascript+css3开发打气球小游戏完整代码
Nov 28 Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 27 Javascript
jQuery中内容过滤器简单用法示例
Mar 31 jQuery
OpenLayers3实现对地图的基本操作
Sep 28 Javascript
利用JavaScript模拟京东按键输入功能
Dec 01 Javascript
JavaScript ES6的函数拓展
Jan 18 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
JavaScript静态的动态
2006/09/18 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Python内置模块turtle绘图详解
2017/12/09 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
python标准库OS模块详解
2020/03/10 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
某科技软件测试面试题
2013/05/19 面试题
信息部岗位职责
2013/11/12 职场文书
C++程序员求职信范文
2014/04/14 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
求职自我评价范文100字
2014/09/23 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
辞职信的写法
2015/02/27 职场文书
2016年校长新年寄语
2015/08/17 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
Tomcat用户管理的优化配置详解
2022/03/31 Servers
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
Python何绘制带有背景色块的折线图
2022/04/23 Python