对于闭包的一些理解

一、闭包的定义

关于闭包的定义众说纷纭,下面是一些权威给出的说法:

高程3:“闭包是指有权访问另一个函数作用域中的变量的函数”;

犀牛书:“函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为‘闭包’”;

你不知道的JavaScript(上卷):“当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行”。

而我对于闭包通俗直白的个人理解是:函数定义的作用域链在函数执行后不会消失,而是由内部函数持有对这个函数的作用域的引用,这个引用就叫作闭包。

可以看出,闭包完全是跟“(词法)作用域”想关联,作用域之前已做过大致介绍,之后将会再次深入讨论(词法)作用域。

二、实例

var variable = "window say hello";
function localFun(){
    var variable = "localFun say hello";
    function f(){
        return variable ;
    }
    return f;
}
localFun()();

这里调用 localFun() 会返回 "localFun say hello",相信大家都已经猜到了,但是为什么会返回这个结果呢?我是这样理解的:这里f()是localFun()的嵌套函数,它持有对localFun()内部作用域的引用(而这个引用就叫做闭包),这个引用捕捉到了局部变量,并一直保存了下来,所以返回的是"localFun say hello"。

但是可能有人会觉得外部函数中定义的局部变量在函数返回后就不存在了,所以localFun()的返回值应该是"window say hello"。但现实并非如此,在js中,每次调用函数的时候,都会为之创建一个对象保存局部变量,把这个对象添加到作用域链中。当函数返回的时候,如果没有嵌套的函数,也没有其他引用指向这个绑定对象的时候,它才会被当作垃圾回收掉;而如果函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当做垃圾回收。

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

时间: 2024-08-06 07:35:35

对于闭包的一些理解的相关文章

Javascript关于闭包的个人理解

关于闭包,我理解为定义在一个函数体函数内部的子函数,该子函数拥有唯一的接口和出口.作为函数体的变量被引用,函数体返回时闭包处于激活状态. 关于理解我们可以结合以下代码,我们所看到的闭包的形式: (function(){ //do something })() 1.该子函数可以访问外部函数(函数体)函数作用域中的变量丶参数丶和声明的其他的内部函数(子函数). 2.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包. tips:闭包形式结构中的第二个括号,表示函数被调用,形成闭包

对JavaScript闭包和原型理解

最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这就是一个闭包. 官方解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 如: a=function() { var n=1; b=function( n=n+1; alert(n) } return b; } var c=a()aler

swift官方文档中的函数闭包是怎么理解的?

官方文档中的16页: numbers.map({ (number: Int) -> Int in let result = 3 * number return result }) 不知道这个怎么用,更不知道它所说的要写个把奇数改成0的方法. swift官方文档中的函数闭包是怎么理解的?

浅谈对闭包(Closure)的理解

在理解闭包前理解JavaScript的作用域是有必要的,如果有兴趣,请移步"对JavaScript作用域的认识" 什么是闭包 闭包就是指有权访问另一个函数作用域中变量的函数,通俗点讲闭包就是能够读取其他函数变量的函数.创建闭包的常见方式,就是在一个函数内部创建另一个函数. 1 function fn1() { 2 var a = 1 ; 3 function fn2() { 4 alert(a); 5 } 6 return fn2; 7 } 8 9 var result = fn1()

js中的闭包之我理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能

js闭包(closure),个人理解

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

对闭包的简单理解

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

作用域、原型链、闭包等概念理解

1.执行环境及作用域 (1).执行环境: 定义了变量或函数有权访问的其它数据,决定了它们的各自行为.每个执行环境都有一个与之关联的变量对象(variable object, VO),执行环境中定义的所有变量和函数都会保存在这个对象中,解析器在处理数据的时候就会访问这个内部对象. 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被

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

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