美文网首页
作用域闭包

作用域闭包

作者: 樱木夜访流川枫 | 来源:发表于2018-05-20 14:59 被阅读0次

概览

背景知识:JavaScript内存管理、JavaScript作用域。

内容

1 闭包定义

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

function foo() {
  var a = 2;

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

  return bar;
}

var fn = foo();  // parent函数不会被垃圾回收
fn()  // 2

细节:1 bar函数定义在foo函数内部,bar函数本身被当作一个值类型进行传递,并且它在定义的词法作用域之外执行。
2 foo()执行完后不会被垃圾回收,bar()将一直持有对该作用域的引用,而这个引用就是闭包

以下依然是闭包:

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

   bar(baz);
}

function bar(fn) {
  fn();  // 闭包
}

总结:无论通过何种手段将内部函数传递到所在的词法作用域外,它都会持有对原始定义词法作用域的引用,无论在何处执行这个函数都会使用到闭包

闭包 定时器:

function wait(message) {
   setTimeout(function timer() {
    console.log(message);
   }, 1000);
}

wait();

分析:wait()执行1000ms后,它不会被垃圾回收,timer()依然wait()作用域的闭包。

闭包 事件监听器:

function addEvent(selector) {
  $('selector').click(function cb() {
    // todo
  })
}

addEvent(btn);

谨记:在定时器、事件监听器、Ajax请求、跨窗口通信、WebWorkers或者任何其他的异步(或同步)任务中,只要使用了回调函数,实际上就是使用闭包。

相关文章

  • 作用域和闭包

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

  • 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/kfhtjftx.html