js中的闭包

作者: wolfBite | 来源:发表于2021-03-31 16:56 被阅读0次

闭包,英文叫做closure,借用MDN中的解释,一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。js中的闭包有以下几个特性:

    1.存在函数的嵌套

    2.内部函数可以引用外部的变量以及参数

    3.变量以及参数 不会被垃圾回收机制回收

例子如下:

function outFn(){

   var name = 'wolfBite'; // 外部函数变量

   function innerFn(){ //内部函数

      console.log( 'hi '+name +'!') //引用外部的变量 name

   }

   innerFn();

}

outFn(); // hi wolfBite!

    函数outFn定义了局部变量 name 和函数 innerFn,函数innerFn中的console语句 引用name,注意函数innerFn内部没有定义局部变量name,   最后函数outFn执行了函数innerFn。调用ouFn(),打印出问候语‘hi wolfBite!’。

第二个例子如下:

function outFn(){

   var name = 'wolfBite'; // 外部函数变量

   function innerFn(){ //内部函数

      console.log( 'hi '+name +'!') //引用外部的变量 name

   }

   return innerFn; //直接返回

}

var myFn = outFn(); // 接收返回值(此时outFn执行完了,但变量name并没有被回收机制回收)

myFn();// hi wolfBite!

    会发现例子二和例子一的区别,函数outFn最后没有直接执行innerFn,而是将函数innerFn返回,代码最后没有直接执行函数outFn,而是将outFn的执行结果(函数innerFn)返回给变量myFn ,最后再执行myFn();

    你可能会觉得执行完 ‘var myFn = outFn();’这语句之后,outFn内部定义的变量name已经被回收机制回收了,innerFn无法访问这个变量,然而代码仍按预期运行。原因是函数innerFn形成了闭包,这个闭包是由这个函数和创建该函数时的词法环境组合而成,这个环境包含了这个闭包创建时所有的局部变量。例子二中myFn 是 执行outFn时返回的innerFn实例的引用,innerFn的实例维持了一个对它的词法环境(变量 name 存在于其中)的引用,因此当myFn调用时,变量name仍可访问。

闭包 - JavaScript | MDN

相关文章

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 简单的聊一下闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 浅谈闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • JS闭包

    JS闭包 闭包练习

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • 2018-01-10

    js中的闭包 一.什么是闭包 闭包官方的解释是:闭包就是能够读取其他函数内部变量的函数。由于在javascr...

  • js经典题目

    1闭包 链接:学习Javascript闭包(Closure) setTimeout在js单线程中只是放在队列中并未...

  • 前端面试题(持续补充)

    js,node.js基础: 闭包 闭包是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数可以访问内部...

网友评论

    本文标题:js中的闭包

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