closure!

总结一下闭包。

闭包的定义:当一个内部函数被其外部函数之外的变量所引用时,就形成了一个闭包。

一个最简单的闭包:

function A(){
    var count=0;
    return function(){
        count++;
        console.log(count);
    };
}
var B=A();
B();    //1
B();    //2
B();    //3

important!=>javascript的GC机制:

  在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收,否则这个对象一直会保存在内存中。

所以我们就可以理解为什么在上述代码中,A函数明明已经被返回退出执行了,变量count却没有被回收(count一直在原来的基础上增加1,而不是每一次都重新从0开始再增加1),因为匿名函数(闭包)被返回赋予变量B,即被变量B所引用(在javascript中对象的赋值是引用传递),故这个匿名函数不会GC回收,同时变量count被匿名函数所引用,所以变量count亦不会被回收,所以变量count才会一直会保存于内存中。

闭包的特性

js分全局作用域和函数作用域(没有块级作用域,if语句或for循环语句里面定义的变量在外部可以被访问)。函数作用域里可以访问到全局,通过一个叫作用域链(函数内部作用域=>父级函数的作用域=>父级函数的父级函数的作用域...=>全局作用域)的东西。但全局怎么访问函数呢?就有人想了在函数里面返回一个函数(闭包),就可以在全局访问到函数里的数据了(在上面代码中,我们在全局里访问到了A函数的count变量)。

不过闭包能访问到父级函数里面的数据说明父级里的数据一直存在内存中(一直被引用着),而没有被GC所回收,这就会导致内存一直被占着。

时间: 2024-08-24 02:18:16

closure!的相关文章

Python学习---匿名函数和闭包的学习

1.1. 匿名函数 匿名函数的命名规则:  用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b). 因为lamdba在创建时不需要命名,所以,叫匿名函数 add = lambda a, b: a * b print(add(2, 3)) # 6 1.2. 函数式编程和命令式编程 我们常见的编程范式有命令式编程(Imperative programming),函数式编程 常见的面向对象编程是也是一种命令式编程. 命令式编程是面向计算机硬

【GoLang】golang 闭包 closure 参数传递的蹊跷!

结论: 闭包函数可以直接引用外层代码定义的变量, 但是,注意,闭包函数里面引用的是变量的地址, 当goroutine被调度时,改地址的值才会被传递给goroutine 函数. 介绍 go的闭包是一个很有用的东西.但是如果你不了解闭包是如何工作的,那么他也会给你带来一堆的bug.这里我会拿出Go In Action这本书的一部分代码,来说一说在使用闭包的时候可能遇到的坑.全部的代码在github上. 闭包的坑 首先看一段代码: search/search.go 29 // Launch a gor

学习Javascript闭包(Closure)

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

聊一下JS中的作用域scope和闭包closure

scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久,无论看别人如何解释,就是不通.不过理越辩越明,代码写的多了,小程序测试的多了,再回过头看看别人写的帖子,也就渐渐明白了闭包的含义了.咱不是啥大牛,所以不搞的那么专业了,唯一的想法就是试图让你明白什么是作用域,什么是闭包.如果看了这个帖子你还不明白,那么多写个把月代码回过头再看,相信你一定会有收获:如果看这个帖子让你收获到了一些东西,告诉我,还是非常

javascript Closure 闭包

引用自 http://www.cnblogs.com/mguo/archive/2013/06/19/3143880.html /*一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量.*/ var n=999; function f1(){ alert(n); } f1(); // 999//另一方面,在函数外部自然无法读取函数内的局部变量. funct

让我们一起写出更有效的CSharp代码吧,少年们!

周末空闲,选读了一下一本很不错的C#语言使用的书,特此记载下便于对项目代码进行重构和优化时查看. Standing On Shoulders of Giants,附上思维导图,其中标记的颜色越深表示在实际中的实际意义越大. 名称 内容和示例 提供API时尽量提供泛型接口 Public interface IComparable<T>{ int CompareTo(T other) } 泛型约束尽可能的严格并有效 Public delegate T FactoryFunc<T>();

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

Chromium多线程通信的Closure机制分析

为了充分利用CPU多核特性,Chromium在启动时会创建很多线程,来负责执行不同的操作.这样就涉及到了多线程通信问题.Chromium为每一个线程都创建了一个消息队列.当一个线程需要另一个线程执行某一操作时,就向该线程的消息队列发送一个Closure.这个Closure最终在目标线程中得到执行.这种基于Closure的多线程通信方式在Chromium中使用得很普通,因此本文就对它的实现进行分析. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Closu

JavaScript闭包(Closure)学习笔记

闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解JavaScript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. JavaScript语言的特殊之处,就在于函数内部可以直接读取全局变量. var n=999; function f1() { alert(n); } f1(); // 999 另一方面,在函数