既然说到在JavaScript中函数作为“一等公民”而存在,那我们就不得不谈一下另一个高级的函数专题——闭包(closure)。
很多语言都对闭包有不同程度的支持,像是Ruby、Python以及objective c。学过Java的应该知道,Java虽然没有显式支持闭包,但对于非静态内部类而言,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以吧非静态内部类当成面向对象领域的闭包。
简单地说,闭包就是Function实例,外加对于Function实例的执行来说必需的、来自环境的本地变量。在声明函数时,可以在声明之处引用其作用域内的任何变量。甚至在声明之处已经超出作用域而关闭声明之后,这些变量仍为该函数所支持。
看如下代码:
<head> <title>Closure</title> <scriptsrc="jquery.js"></script> <script> $(function(){ varlocal=1; //名为local的本地变量 window.setInterval( //建立3s触发一次的计时器 function() { //将内容增加到div元素中 $('#display').append('<div >At'+new Date()+ ' local='+local+'</div>'); local++; }, 3000); }); </script> </head> <body> <divid="display"></div> </body> </html>
加载页面,一段时间后,我们看到页面内容为:
At Sun Apr 07 2013 14:18:25 GMT+0800 (中国标准时间) local=1 At Sun Apr 07 2013 14:18:28 GMT+0800 (中国标准时间) local=2 At Sun Apr 07 2013 14:18:31 GMT+0800 (中国标准时间) local=3 At Sun Apr 07 2013 14:18:34 GMT+0800 (中国标准时间) local=4 At Sun Apr 07 2013 14:18:37 GMT+0800 (中国标准时间) local=5 At Sun Apr 07 2013 14:18:40 GMT+0800 (中国标准时间) local=6
我们可能认为,在回调函数(setInterval函数里的函数)执行期间,local的值应该是未定义的(因为local定义在回调函数之外,且回调函数在页面加载3秒内触发,也就是在就绪处理函数执行完毕很久才触发)。但是为什么出现了上面的页面内容呢?
这就是我们所说的“闭包”。JavaScript里所有的闭包,被隐式地创建。当就需处理程序退出时,虽然local声明所在的块确实超出了作用域,但是函数声明所创建的闭包(包括local),在该函数的生命期内保持在作用域内。
注意:无意的闭包可能带来意外的后果,例如,循环引用可以导致内存泄露。内存泄露的典型事例是创建向后引用闭包变量的DOM元素,组织了那些变量的回收。
相关推荐
**jQuery学习笔记** jQuery,作为一个轻量级的JavaScript库,极大地简化了JavaScript的DOM操作、事件处理、动画设计以及Ajax交互。这篇学习笔记将深入探讨jQuery的核心概念和实用技巧,帮助初学者快速上手。 ## 一...
这篇学习笔记将探讨这两个技术的基础和关键概念。 首先,JavaScript是一种轻量级的脚本语言,它主要在客户端运行,允许网页对用户交互做出实时响应。JavaScript的核心特性包括变量、数据类型(如字符串、数字、布尔...
【jQuery学习准备工作详解】 在深入学习jQuery之前,我们需要先对前端开发的基础有一个全面的理解。jQuery是一种强大的JavaScript库,它简化了HTML文档遍历、事件处理、动画制作和Ajax交互等任务。本篇将从理论基础...
学习笔记会涵盖JavaScript的基础语法、变量、数据类型、控制结构、函数、对象、数组、作用域、闭包、异步编程(Promise和async/await)等内容。同时,也会介绍ES6及以后版本的新特性,如箭头函数、模板字符串、解构...
JavaScript,一种广泛应用于Web开发的脚本语言,是前端开发的核心...随着学习的深入,还会接触到更多高级特性和框架,如闭包、原型链、AJAX、jQuery、Vue.js、React.js等,这些都是JavaScript开发者必备的知识技能。
先来看代码: 代码如下:(function (window, undefined) { //构建jQuery对象 var document = window.document, navigator = window.navigator, location = [removed]; var jQuery = (function () { var jQuery ...
本学习笔记旨在帮助初学者快速掌握JavaScript的核心概念和技术,实现从入门到精通的过渡。 1. **基础语法** - 变量声明:JavaScript支持var、let和const关键字声明变量,理解它们的作用域和提升特性至关重要。 - ...
这篇"JavaScript入门新手学习笔记"提供了全面的学习资源,适合初学者系统性地掌握这一技术。 笔记可能包含了以下关键知识点: 1. **基础语法**:JS的基础包括变量(var、let、const)、数据类型(如字符串、数字、...
**jQuery学习资源详解** jQuery,一个轻量级的JavaScript库,因其简洁的API和强大的功能而备受开发者喜爱。本资源包“jquery学习资料,好多例子”包含了一系列实用的学习材料,旨在帮助初学者快速掌握jQuery的核心...
jQuery的核心思想是“链式调用”和“封装”,源码中大量使用了闭包和原型链,值得深入学习。 **七、工具** jQuery还提供了一些开发工具,如jQuery Migrate,帮助开发者解决旧版本jQuery代码在新版本中的兼容问题。...
【学习笔记 MHT3】是一份综合性的IT学习资源,主要涵盖了源码分析、工具使用以及Web应用程序开发的多个方面。MHT文件是单一文件网页(MHTML)的格式,通常用于保存完整的网页内容,包括文本、图片和其他资源。这份...
6. **闭包**:函数可以访问并操作其词法作用域内的变量,即使该作用域已经结束。 **jQuery基础与应用** 1. **选择器**:jQuery提供了一系列CSS选择器,如ID选择器、类选择器、属性选择器等,用于高效地选取DOM元素...
这篇学习笔记将主要关注JS及其相关的技术。以下是对每个文件名称所对应知识点的详细说明: 1. **ECMAScript (3.1.ECMAScript.docx)** ECMAScript是JavaScript的标准化规范,由ECMA国际维护。自1997年以来,已经...
这份"JS学习笔记.docx"是针对JavaScript初学者的入门资料,旨在帮助读者快速掌握JavaScript的基础知识。 一、常用快捷键 在编程中,快捷键能够提高编程效率。在JavaScript开发中,熟悉如Ctrl+C(复制)、Ctrl+V...
在描述中,“写于初学时,适于初学者,仅供参考,随意分享”表明这些材料可能是作者学习过程中的笔记或项目,可能包含一些基础实践和学习心得,对于同样初学者来说是一份不错的学习资源。 至于“五子棋”这个文件名...
JavaScript是一种广泛用于网页和网络应用的轻量级脚本语言,与...随着对JavaScript深入的学习,你还会接触到原型链、闭包、异步编程(如回调、Promise和async/await)等高级主题,这些都是构建复杂Web应用程序的基础。
这篇学习笔记将带你深入了解JavaScript的基础和一些进阶应用。 首先,我们从"Js基本语法"开始。JavaScript是一种弱类型、解释型的脚本语言,它支持变量声明(var、let、const)、数据类型(包括基本类型:字符串、...
这个“javaScript学习笔记.rar”压缩包显然包含了作者在学习JavaScript过程中的心得和记录,对于初学者或者想要深入理解JavaScript的人来说,是一份宝贵的资源。 JavaScript与Java虽然名字相似,但两者实际上是不同...
压缩包中的“JavaScript学习笔记集”可能包含了语言的基本概念、语法特性、面向对象编程、闭包、原型链、作用域、异步编程等内容的详细解释。而“代码库”可能包含了大量的示例代码,涵盖各种常见任务,如表单验证、...