# 立即执行函数(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出来后,感觉一般的业务中场景都不太需要用到闭包,加上学习并正确的使用闭包,感觉没什么问题。

你可能感兴趣的:(javascript)