js-我理解的闭包

一:什么是闭包  

  《JS高级程序设计》指出:闭包是指有有权访问另一个函数作用域中变量的函数。

二:闭包的使用

   闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中的变量。

 1       function add(){
 2             var a=1;        //暂且叫 innerAdd 函数        
 3             return function(){
 4                 a++;
 5                 console.log(a);
 6             }
 7         }
 8         add()();
 9         add()();
10         console.log("------------------------");
11         var addAfter=add();
12         addAfter();
13         addAfter(); 

     8行---- 2

     9行-----2

      12,13行 ---2,3

   那么,为什么第9行得到的结果仍然是2,而不是期待中的3呢?

     这里因为JS里也有 C# Java里中的 垃圾回收 机制。

    (1) 函数未被引用,执行完后,该函数作用域就会被回收。

    (2)函数如果被其他变量引用,该函数作用域就会被保存下来。

    第8,9行,add()函数并没有被其他变量引用,只是简单的执行,因此,a的作用域只存在该函数中。

    11行,add()函数被外部变量 addAfter引用,函数中的a的值被保存在内存中。

      可以这样说:如果innerAdd函数被父亲函数add之外的函数所引用,这样就形成了一个闭包,否则,是不能形成闭包的。

    还有另外一种使用形式:

1        var addMatch=(function(){
2             var a=22;
3             return function(){
4                 a++;
5                 console.log(a);
6             }
7         })();
8         addMatch();
9         addMatch();

三:闭包的问题

  闭包只能取得包含函数中的最后一个变量值,保存的是整个变量对象,而不是某个特殊的变量。

1         var arr1=[12,19,3],arr2=[],arrLength=arr1.length;
2         for(var i=0;i<arrLength;i++){
3             arr2[i]=function(){
4                 console.log(i);
5                 return i;
6             };
7         } 

四:闭包的应用场景

时间: 2024-08-10 15:12:09

js-我理解的闭包的相关文章

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之前一直做使用Java语言开发,其丰富的组件类库使得开发效率那叫一个快呀!突然转来做JavaScript一时间还有点儿不适应(快半年了),不过自从看见那么多漂亮的网站和对JavaScript接触的越来越多,也发现了其中的一些乐趣.正如自己一直坚信的那样,编程语言仅仅是工具,重要的是编程思想!使用Jav

深入理解Javascript闭包概念

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

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关引用环境组成的实体. 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量. Java中闭包实现 关键点: 如何用变量去存储方法? java中能够保存方法的变量指的就是普通的对象 如何让这个普通对象能够访问所在类的自由变量?

vue自定义指令(Directive中的clickoutside.js)的理解

.array p { counter-increment: longen; margin-left: 10px } .array p::before { content: counter(longen) "." } .alink { font-size: 16px; color: blue } 阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DO

轻松理解JavaScript闭包

摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数.下面列举出常见的闭包实现方式,以例子讲解闭包概念 function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 f1是

理解JAVASCRIPT 闭包

最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念"闭包". 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这句话是我自己总结的,或许不太准确. 你能看到的多少这句话该如何理解呢? 下面随便丢一段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var name="Peter"; funct

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =

深入理解javascript闭包(一)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.什么是闭包? 官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的"闭包". 要理

Python_基础个人理解_闭包

闭包 ---- 个人理解简述 闭包在某种含义上其本身其实也是一个函数. 定义的格式简单来说为在一个函数内部再创建一个函数, 也就是一个外函数包裹了一个内函数, 在内函数里使用了外函数的临时变量, 外函数的"return"返回值为内函数的引用(函数名). 在形式上与循环嵌套有些相似, 暂且也可称之为函数嵌套. 闭包的使用可以有效的隐藏函数内部的工作细节, 只给外部使用者提供一个可以执行的内部函数的应用. 如果在外函数里自定义了变量并且需要在内函数中对其进行修改, 需要将变量声明为 &qu

JS核心知识点梳理——闭包

闭包 闭包这个东西咋说呢,不同的程序员,不同的资料都有不同的解释,你可以把它理解成一个函数,也可以把它理解函数+执行环境. 我们这里不纠结闭包的定义,而是关注闭包的现象,应用,再结合相关面试题去攻克它,最后谈一下我对闭包的理解. 现象 之前说过,函数执行,生成执行环境,函数执行完,销毁执行环境.嗯,听上去很正常,不用的东西就销毁嘛. 但是如果函数执行完,该函数上下文还用怎么办,有用的东西肯定不敢销毁了,这个就是闭包的现象,那么引起这个现象的鄙人就把它理解成闭包! 1 function foo (