美文网首页
作用域闭包

作用域闭包

作者: kim_jin | 来源:发表于2019-08-18 22:37 被阅读0次

闭包的定义:当函数可以记住并且访问所在的词法作用域的时候,就会产生闭包,即使函数是在当前词法作用域之外执行的。

function foo (){
  var a = 2;
  function bar(){
    console.log(a); // 2
  }
  bar();
}
foo();

上面的代码会在控制台打出2,上面的执行结果是基于词法作用域的查找规则,函数bar()可以访问外部变量中的a的值。
上面的代码我们从逻辑上看,可以看出,这个并不是完全的闭包,因为bar()只是对a的引用方法是词法作用域的查找规则,而这些规则只是闭包定义中的一部分,所以我们再看一下下面的一段的代码:

function foo (){
  var a = 2;
  function bar (){
    console.log(a)
  }
  return bar;
}

var baz = foo();
baz(); // 2

函数bar()的词法作用域可以访问foo()的内部作用域。然后我们将bar()函数本身当做一个值类型进行传递,在这个例子中,我们将bar所引用函数本身当做一个值类型进行传递,在这个例子中,我们将bar所引用的函数本身当做返回值。
在foo执行之后,将其返回值,也就是bar的内部函数直接返回给了baz变量,并且调用baz(),实际上只是通过不同的标识符引用调用了内部的函数bar();
我们再foo()执行之后,通常会期待foo()的整个内部作用域都会被销销毁,因为我们的引擎都是拥有垃圾回收机制的,这个机制会及时的释放内存,因为一般情况下,执行过的foo,引擎一般会认为是没有必要再次继续执行的,所以会对这个部分的内纯进行垃圾回收。然而“闭包”就是一个例外的场景,事实上内部的作用域是依然存在的,内部的内纯并没有被回收,那么是谁在使用这个内存呢?其实,就是bar()本身在使用这个部分的内存。
因为bar()的声明位置,它拥有涵盖foo()内部作用域的闭包,让转让工人作用域内可以一直存在,以供bar()在任何时候进行调用。bar()依然持有对该作用域的引用,而这个引用就叫做闭包。

相关文章

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • 2018-01-07 关于javascript闭包和作用域的理解

    关于 javascript 闭包的一些思考 作用域 词法作用域 函数作用域 块作用域 闭包 什么是作用域? 作用域...

  • js作用域、闭包

    闭包 闭包作用 全局 局部 作用域链

  • javaScript门道之闭包

    闭包的学习路径:变量的作用域 -> 闭包的概念 ->闭包的应用 1.变量的作用域 变量的作用域分为作用于全局和作用...

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • 执行环境 & 作用域 & 闭包

    执行环境 & 作用域 & 闭包 执行环境 , 作用域 , 闭包 , 闭包应用 执行环境 执行环境定义了 当前环境的...

  • js 总结七07-19

    作用域 全局 局部 作用域链 闭包

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • js闭包

    由于作用域的关系,函数之间不能相互读取变量,父级作用域不能读取子级作用域的变量。这是闭包出现了。 闭包 闭包就是能...

网友评论

      本文标题:作用域闭包

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