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之自定义类型
May 04 Javascript
button没写type=button会导致点击时提交
Mar 06 Javascript
js QQ客服悬浮效果实现代码
Dec 12 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
Javascript实现获取及设置光标位置的方法
Jul 21 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
Nov 10 Javascript
js实现弹窗暗层效果
Jan 16 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 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
介绍几个array库的新函数 php
2006/12/29 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
linux iconv方法的使用
2011/10/01 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
php随机抽奖实例分析
2015/03/04 PHP
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
vuex进阶知识点巩固
2018/05/20 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
python 生成不重复的随机数的代码
2011/05/15 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python3 求约数的实例
2019/12/05 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
JPA面试常见问题
2016/11/14 面试题
五型班组建设方案
2014/02/10 职场文书
工程承诺书怎么写
2014/05/24 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript