js闭包的前世今生详解

  • 闭包
  • 如何从外部读取函数内部的局部变量?
  • 闭包的概念?
  • 闭包的用途?
  • 如何让变始终保持在内存中?
  • 常见的闭包写法
  • 闭包的实际应用

闭包

闭包是javascript的一个难点,也是特色。理解闭包,首先要了解javascript的全局变量和局部变量。在js的函数中,函数的内部是可以直接访问全局变量,但是函数的外部无法访问函数内部的局部变量。

如何从外部读取函数内部的局部变量?

我们需要函数内部的局部变量,正常情况下,这是办不到的。但是可以通过在函数的内部再定义一个函数
functiuon f1(){var a = 1;function f2(){console.log(a) // => 1}
}

闭包的概念?

上面代码中的f2函数,就是闭包。个人认为闭包就是就是能够读取到其他函数内部变量的函数
在javascript中,只有函数内部的子函数才能读取到局部变量,所以闭包也可以简单的理解成:‘定义在一个函数内部的函数’。所以本质上闭包是将函数内部和函数外部链接起来的桥梁。

闭包的用途?

闭包可以用在很多地方,它的最大用途有两个,一个是前面写到的可以读取到函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会因为f1函数被调用后自动清除。

如何让变始终保持在内存中?

上面的例子 f1函数时f2函数的父函数,而f2被赋值给了一个全局变量,这导致f2始终在内存中,而f2的存在关系依赖于f1,因此f1也始终在内存中。不会再调用结束后,被垃圾回收机制回收。

常见的闭包写法

  • 在构造函数中
function number1(){var n = 0;this.add = function(){n++;console.log(n)}
}
var num1 = new number1();
num1.add();
num1.add();//另一种写法
function number2(){this.n = 0;this.add = function(){this.n++;console.log(this.n)}
}
var num2 = new number2();
num2.add();
num2.add();
  • 常见的闭包写法
function number(){var n = 0;function add(){n++;console.log(n)}return add;
}
var num1 = number() //函数名只是一个表示符(指向函数的指针),而()才是执行函数
num1();
num1();
function number(){var n = 0;function add(){n++;console.log(n)}return add();
}
number()();
var number = (function(){var n = 0;return function(){n++;console.log(n)}
}());
number();

闭包的实际应用

//封装
var Person = function(){//变量作用域为函数内部,外部无法访问var name = "张三";return {getName:function(){return name;},setName:function(newName){name = newName}}
}();
console.log(Person.name)
//通过person.name无法获取到name的值。
console.log(Person.getName());
Person.setName('李四');
console.log(Person.getName());
// 继承
function Person(){var name = '张三';return {getName:function(){return name;},setName:function(newName){name = newName}}
}
var blackpeople = function(){};
//让黑人继承person
blackpeople.prototype = new Person();
var p = new blackpeople();
p.setName('william');
console.log(p.getName())

javascript闭包的前世今生相关推荐

  1. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  2. JavaScript学习总结(十六)——Javascript闭包(Closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什 ...

  3. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  4. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  5. JavaScript闭包如何工作?

    您将如何向了解其闭包概念(例如函数,变量等)的人解释JavaScript闭包,但却不了解闭包本身? 我已经在Wikipedia上看到了Scheme示例 ,但是不幸的是它没有帮助. #1楼 我知道已经有 ...

  6. 让你分分钟理解 JavaScript 闭包

    原文:https://www.cnblogs.com/onepixel/p/5062456.html 让你分分钟理解 JavaScript 闭包 闭包,是 Javascript 比较重要的一个概念,对 ...

  7. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  8. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  9. [转]Javascript 闭包

    [转]Javascript 闭包 简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭 ...

最新文章

  1. 自定义类似于listView中Item背景
  2. Android开发环境搭建全程演示(jdk+eclip+android sdk)
  3. SCI论文的时态、主动语句和被动语句总结
  4. jquery获取下拉框的值并传递给后端处理
  5. 代码不会骗人,但有时注释会
  6. Vue笔记--高级入门
  7. 对于利用blender获取谷歌地图3D模型的补充
  8. 惠普HP ProDesk 400 G2 加装BCM94352HMB网卡
  9. C++软件调试与异常排查从入门到精通系列汇总
  10. 费马大定理四分之一解决
  11. Python数据分析学习系列 十三 Python建模库介绍
  12. Android LogCat使用详解
  13. java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.synchronization()Ljavax/persistence
  14. python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...
  15. Linux Power supply子系统分析之一
  16. Zabbix一键部署
  17. 2022年全球市场智能纺织品总体规模、主要生产商、主要地区、产品和应用细分研究报告
  18. 前端设计稿转代码现状,会不会失业?
  19. 报错处理 ITK only supports orthonormal direction cosines. No orthonormal definition found
  20. FW:腰椎间盘突出锻炼

热门文章

  1. Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
  2. 大数据三大冰点待破:只见树木 不见森林
  3. Python综合实战-股票数据分析处理(查询接口)
  4. Word文档目录自动生成和页码设置
  5. 找出阿里云服务器无法访问淘宝司拍页面原因
  6. XML 中的延时等待控制函数Wait
  7. Firefox的about:config设置详解
  8. 【BPM架构】BPM 平台:独立还是微服务实现
  9. Java -- jsp 文件包含
  10. 【NiFi系列】1-基本介绍