美文网首页
javascript 作用域闭包

javascript 作用域闭包

作者: 零穆 | 来源:发表于2020-07-14 15:48 被阅读0次

什么是闭包

  当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。我们先看一段代码

function foo() { 
  var a = 2; 

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

  bar(); 
}

foo();

  上面这个是闭包吗?很遗憾,从定义的角度来说它并不是。

function foo() { 
  var a = 2; 

  function bar() { 
    console.log( a );
  }

  return bar;
 }

var baz = foo(); 

baz(); // 2 ———— 朋友,这就是闭包的效果。

  我们用全局变量baz接收了 foo返回的函数 bar,因此我们阔以在其他任何作用域中使用 baz去获取 foo内部的元素。这种就是闭包。

var fn; 

function foo() { 
  var a = 2;

 function baz() { 
    console.log( a ); 
  }

  fn = baz; // 将baz分配给全局变量
}

function bar() { 
    fn(); // 妈妈快看呀,这就是闭包! 
}

foo(); 

bar(); // 2

  无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
  如果你很熟悉jQuery(或者其他能说明这个问题的JavaScript框架),可以思考下面的代码:

 function setupBot(name, selector) { 

    $( selector ).click( function activator() { 
      console.log( "Activating:" + name ); 
    } );

 }

setupBot( "Closure Bot 1", "#bot_1" ); 
setupBot( "Closure Bot 2", "#bot_2" );

  本质上无论何时何地,如果将函数(访问它们各自的词法作用域)当作第一级的值类型并到处传递,你就会看到闭包在这些函数中的应用。在定时器、事件监听器、Ajax请求、跨窗口通 信、Web Workers或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!

闭包的特点

  1. 让外部访问函数内部变量成为可能;
  2. 局部变量会常驻在内存中;
  3. 可以避免使用全局变量,防止全局变量污染;
  4. 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

相关文章

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

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

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

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

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

  • 作用域闭包

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • JavaScript 作用域

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • 闭包、定时器

    一、什么是闭包? 有什么作用 1.变量的作用域  要理解闭包,首先必须理解JavaScript的变量作用域。变量的...

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

  • 你不可不知道的 JavaScript 作用域和闭包

    原文出处:JavaScript Scope and Closures 作用域和闭包是 JavaScript 中重要...

  • JavaScript中的闭包

    1.什么是闭包 要理解什么是闭包,就得先理解变量的作用域。在JavaScript中,有两种作用域,全局作用域和函数...

网友评论

      本文标题:javascript 作用域闭包

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