闭包

作者: zy懒人漫游 | 来源:发表于2018-02-05 21:56 被阅读0次

作用域

理解闭包之前我们要弄清楚js的变量作用域,变量作用域就2种,

  • 全局变量
  • 局部变量

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

  var a=1;
 function fn(){
   console.log(a);
 }
 fn(); //1

函数外部不能读取函数内部的局部变量

 function fn(){
   var a=1;
 }
  console.log(a);//报错

注意:函数内部声明变量的时候,一定要使用var声明。如果不用的话,实际上声明的是一个全局变量。如下

 function fn(){
   var a=1;
 }
  fn()
  console.log(a);//1

外部读取局部变量

当有时候我们需要从外部得到函数内部的变量时,这个时候我们可以在函数内部再定义一个函数

function fn1(){
  a=1;

  function fn2(){
     console.log(a); // 1
    }
 }

  • 函数fn2就被包括在函数fn1内部,这时fn1内部的所有局部变量,对fn2都是可见的。但是反过来就不行,fn2内部的局部变量,对fn1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构.
  • 子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
  • 既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们就可以在f1外部读取它的内部变量。如下
function fn1(){
  a=1;
  function fn2(){
    console.log(a);
  }
  return fn2;
}
var result=fn1();
result(); // 1

闭包的概念

  • 闭包就是指函数可以记住并访问所在的词法作用域,并且保持着对词法作用域的引用,即使函数在当前作用域之外执行,就会形成闭包。
  • 对于闭包的形成,实质上就是所涉及的词法作用域和将函数作为值return
  • 当在函数内部声明了内部函数,并将内部函数作为值返回,就会产生闭包。
  • 在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
例子
这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

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

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • javascript闭包详解

    跟我念 bi 闭 bao包 ,闭包的闭,闭包的包。。 闭包的简介 在计算机科学中,闭包(英语:Closure),又...

网友评论

      本文标题:闭包

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