美文网首页饥人谷技术博客
简单理解闭包与立即执行函数

简单理解闭包与立即执行函数

作者: 饥人谷_Grey高 | 来源:发表于2017-08-18 19:41 被阅读0次

闭包

闭包 是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。——《JavaScript高级程序设计》

首先明确JS中函数的作用域确定的基本原则:

  1. 外部函数作用域不能看到内部函数的作用域;
  2. 内部函数作用域可以看到外部函数的作用域;

那么如何能访问或修改到一个函数内部的变量呢?
函数的return就是这个传送门,可以将一个内部函数送出外部函数。 即使无法直接访问到外部函数内部的变量,也可以通过return出的内部函数去访问或修改外部函数的变量。

用一个简单的例子来解释。

function outerFn(){
    var data = 10
    var innerFn = function(){
          data += 1
          console.log(data)
    }
    return innerFn
}
var result = outerFn()
result()
result()
// 11
// 12

现有一个名为outerFn的函数,它的内部包含一个已经声明的变量data和一个内部函数innerFn。一般情况下,是无法访问或修改data的,但是innerFn可以访问到data,我们通过调用return出的innerFn,就可以间接的去修改和访问到data的数据了。
这样的做法,被总结称为 闭包

为什么要这么做?

  1. 为一个封闭的函数作用域开一个传送门,让外界可以去访问和修改它;
  2. 将部分函数内部的局部变量暴露,按需求进行共享和长期保存。

需要注意的地方

由于内部函数在被访问后一直处于被引用状态,不能够被垃圾回收。在调用完毕后,如上例,将 result = null ,解除innerFn的引用,方便内存释放,是比较好的方式。

立即执行函数

当我们理解了 闭包 的概念后,就会出现一种需求,我们并不需要多次调用闭包函数,甚至并不需要闭包的返回值,仅仅是需要它执行一次。那上述函数最简单的写法是否如下:

function outerFn(){/* code */}()      //SyntaxError: Unexpected token (

很可惜,结果却是报错。

原因

当JavaScript在读取代码时,看到 function 关键字后,就已经认为这是一个函数声明了,而在函数声明之后,是不可以直接加()来执行的。我们要做的就是让js知道这不是一个函数声明即可。

解决方法

很简单,可以用圆括号将整个函数包起来再(),更可以使用简单的判断符号来处理。这样的做法,就称为 立即执行函数

(function outerFn(){/* code */})()
!function outerFn(){/* code */}()
~function outerFn(){/* code */}()
true && function outerFn(){/* code */}()

可以用来做什么?

一般情况下,只对匿名函数使用这种 立即执行函数 。它的核心是 闭包 ,实现的目的有以下几个:
1. 不必为函数命名,避免污染全局变量;
2. 内部形成单独的块级作用域,封装一些私有变量;
3. 内部变量执行完即销毁,不会占用更多的内存。

相关文章

  • 简单理解闭包与立即执行函数

    闭包 闭包 是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。——...

  • JavaScript闭包(三)

    目录 1.执行环境与作用域链 2. 立即执行函数 3. 闭包知识点 3.1 什么是闭包 3.2 使用闭包的意义与注...

  • 闭包与立即执行函数

    在学习js的过程中,我们都会遇到闭包和立即执行函数的相关概念,今天就这两个概念做一个大致的整理。 本文结构: 闭包...

  • 理解立即执行函数和闭包

    立即执行函数 写代码时尽量不要使用全局变量,因为很可能会相互覆盖 在 java 语言中我们可以用 { } 将代码包...

  • 理解闭包

    什么是「闭包」。 「闭包」的作用是什么。在一个立即执行函数当中: 首先,假设以上几行代码运行在立即执行函数当中,那...

  • IIFE(Immediately-invoked functio

    一、立即执行函数五花八门的写法: 二、立即执行函数与闭包的暧昧关系 像普通的函数传参一样,立即执行函数也能传参数。...

  • es5核心技术

    立即执行函数 函数提升和变量提升 闭包 this 原型链实现继承

  • javascript立即执行函数和闭包

    闭包 概念:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链举例分析: 闭包的应用: 立即执行函数 ...

  • 闭包、立即执行函数闭包、BOM

    题目1: 下面的代码输出多少?修改代码让 fnArr[i]()输出i。使用 两种以上的方法 改写1 改写2 题目2...

  • 闭包_定时器

    闭包的作用是:暴露局部函数立即执行函数 ==> 闭包 下面的代码输出多少?修改代码让 fnArri 输出 i。使用...

网友评论

    本文标题:简单理解闭包与立即执行函数

    本文链接:https://www.haomeiwen.com/subject/kptwrxtx.html