相信很多从事js开发的朋友都或多或少了解一些有关js闭包(closure)的知识。

本篇文章是从小编个人角度,简单地介绍一下有关js闭包(closure)的相关知识。目的是帮助一些对js开发经验不是很多的朋友,使他们可以简单的了解一下js闭包(closure)。

下面言归正传,请大家和我一起来学习一下js闭包(closure)。

1.什么是闭包?

官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

相信很多朋友对这种解释非常反感,因为看完以后根本不知道它想表达什么。

请阅读下面代码,然后让小编告诉你小编自己的理解。

 function f1(){
var n=123;
function f2(){
   alert(n);
  }
return f2;
}
var result=f1();
result(); //

上面代码中f2方法就是闭包。

代码中n是f1方法的局部变量,无法再方法外部获得。因为f2同样在f1方法内部,所以f1的内部所有变量对f2都是可见的,这时只要把f2作为返回值,我们就可以在f1外部读取到f1的局部变量。

注意:f1中局部变量对f2是可见的,但是f2中局部变量对f1则是不可见的。这就是javascript语言的链式作用域(chain scope)。

所以小编理解,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

作用上讲,闭包是将函数内部与函数外部连接起来的一座桥梁。

2.闭包的用途:

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

闭包有两个非常大的用途:

一、就是上面介绍的js闭包(closure)可以让方法内部的局部变量变得可以在方法外部读取

二、js闭包(closure)可以这些变量值始终保持在内存中

怎么来理解js闭包(closure)的第二个用途呢?代码是最通用的语言

function f1(){
var n=123;
  nAdd=function(){n+=1}
  function f2(){
   alert(n);
  }
  return f2;
}
var result=f1();
result(); //
nAdd();
result(); //

上面代码result()方法执行两次,第一执行n值为123,第二次执行n值为124。这说明f1方法中局部变量n一直保持在内存中。

那么上面现象原因是什么呢?

原因是f1返回值为f2,f2被赋值给变量result,result在内存中导致f2也始终在内存中。同时f2是f1的局部方法,f2在内存中导致f1也始终在内存中。这就导致f1没有在调用结束后被垃圾回收机制(garbage collection)回收。

通过上面的介绍,大家有没有对js闭包(closure)有了简单的认识呢?

当然本篇文章只是对js闭包(closure)的简单介绍,如果想深入理解js闭包(closure)还是需要读者朋友们深入研究的。

如果读者朋友们还有对js闭包(closure)不了解的地方,也欢迎大家在评论区一起探讨,也可以直接给我发邮件。

***************************

  非常感谢读者朋友们对小编的支持,小编非常开心可以和大家分享我的开发经验。

  如果我的经验可以帮助到读者朋友们,是小编最大的动力和荣幸。

  2014/11/28 09:57

  ***************************

浅谈js闭包(closure)的更多相关文章

  1. 浅谈Js闭包现象

    一.1.我们探究这个问题的时候如果按照正常的思维顺序,需要知道闭包是什么它是什么意思,但是这样做会让我们很困惑,了解这个问题我们需要知道它的来源,就是我们为什么要使用闭包,先不管它是什么意思!     ...

  2. 浅谈js闭包

    相信很多人只知道闭包这个词但是具体是怎么回事就不太清楚了,最近在群里有很多小伙伴讨论这个问题但还是蒙眬眬的赶脚.索性就写了这篇文章来帮助大家一起理解闭包. 变量作用域 闭包其实想明白了很简单,但是在理 ...

  3. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  4. 浅谈 js 语句块与标签

    原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...

  5. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  6. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  7. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  8. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  9. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

随机推荐

  1. 什么是“恶意代码”——————【Badboy】

    恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到还有一段程序中,从而达到破坏被感染电脑数据.执行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 按传播方式,恶意代码能够分 ...

  2. Android检测网络是否可用并获取网络类型

    在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...

  3. Method and apparatus for establishing IEEE 1588 clock synchronization across a network element comprising first and second cooperating smart interface converters wrapping the network element

    Apparatus for making legacy network elements transparent to IEEE 1588 Precision Time Protocol operat ...

  4. Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷)

    原文 Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷) Windows 10 Fall Creators Update(Build ...

  5. 第1讲:The nature of Testing--測试的本质

    *********声明:本系列课程为Cem Kanner的软件黑盒測试基础的笔记版************** What's A COMPUTER PROGRAM? Textbooks often d ...

  6. 局部QEventLoop帮助QWidget不消失(也就是有一个局部事件循环始终在运行,导致程序被卡住那里,但仍可以接受事件。说白了就是有一个while语句死活不肯退出,直到收到退出信号)

    熟悉的陌生人 Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道.,只是你可能没有意识到: QCoreApplicaton::exec() QApplication ...

  7. matlab 类型转换(类型判断)

    char:Convert to character array,转换为字符数组:matlab 下没有 str 字符串类型转换: char(0-255) ⇒ ASCII 码的转换: im2double( ...

  8. OO五大原则

    1.单一职责原则 应该有且仅有一个原因引起类的改变 2.里氏替换原则 所有引用基类的地方必须能够透明的使用其子类的对象 3.依赖倒置原则 高层模块不应该依赖底层模块,两者都应该依赖抽象:抽象不应该依赖 ...

  9. 3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子

    原文:3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子 3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子   所用的软件 3ds Max 9.0,Mic ...

  10. Matlab随笔之求解线性方程

    原文:Matlab随笔之求解线性方程 理论知识补充: %矩阵除分为矩阵右除和矩阵左除. %矩阵右除的运算符号为“/”,设A,B为两个矩阵,则“A/B”是指方程X*B=A的解矩阵X. %矩阵A和B的列数 ...