`
隐形的翅膀
  • 浏览: 497121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Script 闭包

 
阅读更多
Javascript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),
而这些键值对是不会随上一级函数的执行完成而销毁。

闭包就是“属性表”,闭包就是一个数据块,闭包就是一个存放着“Name=Value”的对照表
变量的作用域无非就是两种:全局变量和局部变量。



Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 另一方面,在函数外部自然无法读取函数内的局部变量。

函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

二、如何从外部读取局部变量?



出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。



那就是在函数的内部,再定义一个函数。



Js代码

  function f1(){
    n=999;
    function f2(){
      alert(n); // 999
    }
  }



在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),



子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。



既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!





Js代码

  function f1(){
    n=999;
    function f2(){
      alert(n);
    }
    return f2;
  }

  var result=f1();
  result(); // 999


另一个就是让这些变量的值始终保持在内存中。

Js代码

  function f1(){

    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }



  var result=f1();

  result(); // 999
  nAdd();
  result(); // 1000



在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。


为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。



这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此 nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个



匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。


五、使用闭包的注意点



1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。


2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便
分享到:
评论

相关推荐

    Java Script教程

    在"Java Script教程"中,我们将深入探讨这一强大的工具,帮助初学者快速入门并掌握其核心概念。 首先,JavaScript与Java并无直接关系,尽管它们名字相似。JavaScript主要由Brendan Eich在1995年为Netscape ...

    Java Script网页特效实例大全

    在"Java Script网页特效实例大全"中,我们能够找到一系列关于JavaScript特效的实践案例,帮助开发者提升网页交互性和视觉吸引力。 JavaScript的主要特点包括: 1. **解释型语言**:JavaScript代码不需要预编译,...

    Java Script 经典封装

    在这个“Java Script 经典封装”的主题中,我们将深入探讨JavaScript中的封装概念及其在实际开发中的应用。 封装是面向对象编程的一个关键概念,它指的是将数据和操作这些数据的方法捆绑在一起,形成一个独立的实体...

    Java Script 经典教程(九)——JavaScript完全网页教程

    在"Java Script 经典教程(九)——JavaScript完全网页教程"中,我们将会深入探讨JavaScript的核心概念和实际应用,帮助你全面掌握这个强大的语言。 首先,JavaScript的基础知识包括变量、数据类型和操作符。变量是...

    Java Script精彩实例教程

    "Java Script精彩实例教程"是一本专为初学者设计的资源,它提供了丰富的实例来帮助读者理解和掌握JavaScript的基础及进阶概念。 在JavaScript的学习过程中,实例是最有效的教学工具之一。通过实际操作,你可以更好...

    Java script特效网页制作

    在这个"Java Script特效网页制作"的主题中,我们将深入探讨如何利用JavaScript为网页增添动态效果,提升用户体验。 首先,JavaScript的核心在于它的事件驱动特性,通过监听用户的交互行为,如点击、滚动、输入等,...

    java script教学范本

    本Java Script教学范本旨在提供一个全面而详尽的学习资源,帮助初学者和有一定基础的开发者深入理解和掌握JavaScript语言。JavaScript语法基于ECMAScript规范,它支持函数式、面向对象和命令式等多种编程范式,使其...

    Java Script 经典教程(三)——java script 专业设计

    此外,我们还需要理解闭包的概念,它是JavaScript实现数据封装和模块化的一种方式。 在JavaScript中,对象是核心概念。通过字面量语法或构造函数可以创建对象,对象可以通过属性和方法进行操作。ES6引入的类(class...

    Java Script从入门到精通.zip

    "Java Script从入门到精通.zip"这个压缩包包含了丰富的学习资源,涵盖了JavaScript的基础知识到高级应用,帮助初学者逐步掌握这一语言。 首先,JavaScript与Java虽然名字相似,但两者并不相同。JavaScript是一种轻...

    java script例子

    这个“java script例子”压缩包文件提供了一个初级学习者的入门资源,包含了从基础到进阶的1-5章的学习资料,旨在帮助初学者快速掌握JavaScript的核心概念。 首先,我们从第一章开始。这一章通常会介绍JavaScript的...

    Java Script精彩实例教程下载

    JavaScript,不应当与Java混淆,是一种广泛应用于网页和网络应用的编程语言,尤其在前端开发中起着至关重要的作用。它允许开发者实现动态内容,提升用户体验,如交互式表单、动画效果、网页数据处理等。 教程可能...

    Java Script 经典教程(八)——JavaScript技术讲座

    在“Java Script 经典教程(八)——JavaScript技术讲座”中,我们将深入探讨这一强大的编程工具的核心概念和关键特性。 1. **变量与数据类型**: JavaScript 支持动态数据类型,这意味着变量可以存储不同类型的值...

    Java Script开发指南

    闭包是函数内部能访问外部作用域变量的特性,常用于实现数据封装和私有变量。 4. **事件和DOM操作**:JavaScript能够监听和响应用户在网页上的操作,如点击按钮、滚动等。DOM(Document Object Model)是HTML和XML...

    html与Java Script

    4. 函数:JavaScript函数可以作为值传递,实现高阶函数特性,如回调、闭包、箭头函数等。 5. DOM操作:JavaScript可以操作DOM(Document Object Model)来改变网页内容,如通过`document.getElementById`、`document...

    JAVA SCRIPT 函数 完整 版

    7. **闭包**:JavaScript的函数能够访问并操作其定义时的作用域,即使在函数调用后,这种特性称为闭包,常用于实现私有变量和模块化。 8. **高阶函数**:接受函数作为参数或者返回函数的函数,例如`map`、`filter`...

    java script

    在实际工作中,了解和掌握JavaScript的基本语法、控制流、函数、闭包、作用域、原型链、异步编程等概念是必要的。随着技术的发展,ES6(ECMAScript 2015)及以后的新特性,如箭头函数、模板字符串、let和const、解构...

    Java Script 经典教程(七)——JavaScript用户指南

    它与Java虽然名字相似,但实际上是两种截然不同的编程语言。本篇教程将深入探讨JavaScript的基础概念、语法特性以及在实际应用中的使用技巧,帮助你成为一名熟练的JavaScript开发者。 1. **JavaScript基础** - **...

Global site tag (gtag.js) - Google Analytics