js 闭包的简单理解

  let a = function(){
    var i=0;
    let b = function(){
      i++;
      alert(i);
    }
    return b;
  }

  let c = a();

  c();
  这段代码有两个特点:

  1、函数b嵌套在函数a内部;

  2、函数a返回函数b。 
  这样在执行完var c=a()后,变量c实际上是指向了函数b

  当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
闭包有什么作用?
闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,
因为a的内部函数b的执行需要依赖a中的变量
如果a返回的不是函数b,函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收

1、防止全局变量污染。函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

2、在内存中维持一个变量。由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
Javascript的垃圾回收机制

  在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。

  如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

  因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
 
时间: 2024-12-28 16:19:07

js 闭包的简单理解的相关文章

js闭包(closure),个人理解

一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数内部的函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数".所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁. 二.用途 闭包可以用在很多地方.但它最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中. 三.使

对闭包的简单理解

javascript理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部

javascript深入理解js闭包(个人理解,大神勿喷)

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

(原创)JS闭包看代码理解

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JS闭包</title> <script type="text/javascript" src="

对js闭包的粗浅理解

只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(function object).作用域链(scope chain)以及它们如何关联(combination) 首先要建立一个印象,在js中,几乎所有的东西可以看作对象,除了null和undefined.比如常用的数组对象.日期对象.正则对象等. var num = 123; // Number var ar

JS闭包的深入理解

1. javascript 语言的闭包理解 js的变量以作用域划分为两种:全局变量.局部变量.在函数外声明的变量为全局变量,函数内部可以直接调用全局变量.在函数内部声明变量一定要用var 命令,否则就是在函数内部声明了一个全局变量了. 闭包的产生是为了从外部读取函数的局部变量,即在函数内部再定义一个函数f2,把f2作为返回值,在上层函数中返回就可以使上层函数读取其他函数的局部变量了. function f1(){ n=999; function f2(){ alert(n); } return

JS继承(简单理解版)

童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要的一个方面呢 首先一句定义,什么是继承: A对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法. 常见的集成方式有六种,我们今天依次简单的说一下,现在让我们把这六种方式分一下类,大致上可分为三类 第一类:普通类 这类继承方法有个特性,就是简单,容易实现,一共两种: 1.原型链继承 关键点

闭包的简单理解

什么是闭包? 简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数. (父函数包裹子函数,这个子函数中存在能够访问父函数中变量的引用,这个子函数就是闭包) 为什么需要闭包? 局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染,在全局作用域中可以访问到被保存在局部作用域的变量. 特点 占用更多内存 不容易被释放 何时使用? 变量既想反复使用,又想避免全局污染 如何使用? 1.定义外层函数,封装被保

javascript闭包的简单理解

奖Javascript闭包前,先给大家讲个小故事 故事背景:刘备和曹操煮酒的时间段,故事可能有点小差异,刘备为曹操手下,关羽为间谍. 咳咳 曹操很想知道手下新来的刘备整天鼓捣啥: 曹操就问刘备,玄德你整天鼓捣啥: 刘备想,我靠这怎么能告诉你,劳资岂不是找死,打个马虎眼就过去了,曹操什么也没问出来: 刘备回到家里,跟关羽说,二弟,哼,曹操那个傻吊,哼! 关羽晚上也回到家里,跟老婆说,哼,大哥那个傻吊,哼!我这就去告诉丞相: 曹操也不能罢休,就去问关羽,关羽正要去告密,就一五一十  ¥%…@?%%: