乐趣区

关于javascript:立即执行函数IIFE和闭包

IIFE

IIFE: immediately-invoked function expression, 立刻调用函数表达式,函数在定义的时候,立刻执行,是一种语法。

前置常识

理解函数申明和函数表达式的区别

  1. 以 function 结尾的就是函数申明
  2. 痛过赋值给变量的就是函数表达式

例子:

function a() {} // 函数申明
var a = function () {}; //  函数表达式 

模式

(function () {})(); // 模式 1
(function () {}()); // 模式 2
+function () {}();  // 模式 3
-function () {}();  // 模式 4
!function () {}();  // 模式 5
~function () {}();  // 模式 6 
  1. 申明一个函数,个别是匿名函数,因为立刻执行函数是不须要名字的
  2. 将函数申明转换成函数表达式,能够应用上面四个一元运算符 (只用一个操作数):+ – ! ~(按位取反运算符),或者用小括号包裹起来
  3. 让表达式执行,在表达式前面增加小括号让函数立刻执行

作用

  1. 不须要为函数命名,防止净化全局变量
  2. 创立一个独立作用域,这个作用域外面的变量外界拜访不到,防止净化全局变量

应用场景

  1. 页面加载完后,须要立刻执行一些初始化设置,例如事件处理,创建对象等
  2. 在利用中只执行一次的代码

闭包

这个知识点来来回回总结了好屡次,次要本人没有一个太明确的概念,而且再工作中用的场景也很好,前面遇到再好好补充。

闭包:在函数内部拜访函数外部的变量的函数,就是闭包,失常状况下在函数内部是拜访不到函数外部变量的。

举个例子

function a() {let i = 0;}
console.log(i); // ReferenceError: i is not defined

在内部拜访会报错,对吧,因为依据作用域链的规定,只能是函数外部能拜访内部的变量,那我当初有一个需要,我就想拜访外部的变量,怎么办,这个时候就能够应用闭包了。既然外部能够拜访内部的变量,那我就在外部定义一个函数,去拜访这个变量,而后我再把这个函数给返回进来不久能够了。

function a() {
  let i = 0;
  return function b() {console.log(i);
  }
}
let c = a();
c(); // 0

这个革新一下,这个就是闭包了

闭包到底会不会造成内存泄露呢

怎么说呢,这个问题,我感觉有可能会造成内存泄露,只是说有可能,如果在写代码过程中,咱们有意识的应用了闭包,这个时候运行环境 js 引擎优化方面做的好的话会主动帮咱们开释,咱们无需放心,但有的并不会开释,当我的项目特地大的时候,电脑配置又不好的时候,就有可能造成内存透露了。但当初的 js 引擎优化都做的挺好,而且 es6 进去后,感觉个别的业务中场景都不太须要用到闭包,加上学习并正确的应用闭包,感觉没什么问题。

退出移动版