文档章节

闭包(Closures)

KaronChen
 KaronChen
发布于 2015/08/23 23:21
字数 521
阅读 330
收藏 11

问题:

  1. 什么是闭包?有什么用?

  2. 闭包涉及到哪些领域(知识点)?

知识点:

闭包

  1. 是指有权访问另一个函数作用域中的变量的函数。----《JavaScript高级程序设计3版 P178》

  2. 从理论角度:所有的函数都是闭包。因为它们都是在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域;

  3. 从实践角度:以下函数才是闭包

    • 即使创建它的上下文已经销毁它仍然存在(比如,内部函数从父函数中返回)

    • 在代码中引用了自由变量

  4. 最抽象理解:一切函数皆为闭包

------------

闭包分析 ----(涉及作用域链的[[Scope]]属性见《作用域链》笔记~

  1. 涉及自由变量(是指在函数中使用的,但既不是函数参数也不是函数局部变量的变量),也就是函数作用域链的[[Scope]]属性

  2. 一系列代码块(在ECMAScript中,指的是函数)和创建该代码块的上下文数据([[Scope]]属性)的结合;

  3. 同一个父上下文中创建的闭包是共用同一个[[Scope]]属性(如果闭包对其中一个[[Scope]]的变量做修改,会影响到其他闭包对变量的读取,也就是说,所有内部函数都共享一个父作用域);

  4. 对于第3点的典型例子:

    同一个上下文中创建的闭包是共用一个[[Scope]]属性的,但函数激活时,使用的K已经变成3了。

------------

闭包错误理解

  1. 从父上下文中返回内部函数,甚至理解成只有匿名函数才能是闭包。(错误~)

------------

闭包应用

  1. 创建封装的作用域来隐藏辅助对象;

  2. 回调函数;

  3. 延迟调用;

  4. ~~等。





© 著作权归作者所有

KaronChen
粉丝 8
博文 19
码字总数 9811
作品 0
广州
程序员
私信 提问
理解并解决IE的内存泄漏方式[翻译2]

大家节日快乐!俺就继续这个IE内存泄漏的主题来作为节日礼物了,并且相当欢迎大家来一起讨论。这一节讲Closures引起的内存泄漏,最后我还是决定把Closures翻译成了闭包或闭包函数。而且又在K...

唐玄奘
2017/12/12
0
0
javascript 闭包(CLOSURES)详解

javascript 闭包(CLOSURES)详解 知行合一,止于至善2018-01-091 阅读 WEB开发 如下代码,摘录自javascript高级编程 createComparisonFunction函数返回一个比较对象指定属性的匿名函数。该匿名...

知行合一,止于至善
2018/01/09
0
0
JavaScript Closures

JavaScript Closures Closures Scope chain 从这个示例中可以看到inner()函数可以访问到所有的变量,这就是作用域链的效果。 Breaking the chain with a closure The function N has access ...

秋风醉了
2015/04/18
70
0
[新手学Go]GO语言闭包的使用

package main import ("fmt") func main() {f := k(11) //调用k函数fmt.Println(f(1)) fmt.Println(f(2))} func k(x int) func(int) int { //输入x为Int型,返回一个函数func参数为Int,返回值......

廖君
2013/10/27
130
0
web前端学习:深入理解JS闭包

第一部分:初遇闭包 http://www.runoob.com/js/js-function-closures.html 什么是闭包?闭包有什么作用?这是我遇到闭包时的第一反应。 闭包在JavaScript高级程序设计(第3版)中是这样描述:...

IT智云编程
2018/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka再平衡机制详解

所谓的再平衡,指的是在kafka consumer所订阅的topic发生变化时发生的一种分区重分配机制。一般有三种情况会触发再平衡: consumer group中的新增或删除某个consumer,导致其所消费的分区需要...

爱宝贝丶
4分钟前
0
0
element 验证 请输入大于0的整数

data() { var validatePass = (rule, value, callback) => { // if (value <= 0) { // callback(new Error('请输入大于0的整数')); // } else { // c......

沉迷代码我爱学习
15分钟前
0
0
报表工具花钱or开源?我对比了这6个工具

近一年都在处理报表问题,调研了不少报表工具,也开发了适合公司业务的报表应用。分享一些关于如何选择报表工具的个人观点,希望对你有参考作用。 对于大部分企业来说,能花时间和人力去开发...

帆软
15分钟前
0
0
自建redis笔记--Redis cluster搭建

Redis cluster搭建 2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂度大大降...

北极之北
15分钟前
0
0
分享一个在caffe中实现的yolo层

这是别人实现的,是我移植到cc的cpu实现,可以实现caffe中使用yolo3,但是我感觉实际效果不如darknet 好点 template <typename Dtype>inline Dtype sigmoid(Dtype x){return 1. / (1. ...

开飞色
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部