Javascript 闭包[翻译]

作者:为之漫笔 来源:cn-cuckoo.com 时间:2008-09-28 20:59:00 

简介

  • Closure

  • 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。


闭包是 ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下。如果想要扬长避短地使用闭包这一特性,则必须了解它们的工作机制。而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。

关于闭包,最简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

遗憾的是,要适当地理解闭包就必须理解闭包背后运行的机制,以及许多相关的技术细节。虽然本文的前半部分并没有涉及 ECMA 262 规范指定的某些算法,但仍然有许多无法回避或简化的内容。对于个别熟悉对象属性名解析的人来说,可以跳过相关的内容,但是除非你对闭包也非常熟悉,否则最好是不要跳过下面几节。

对象属性名解析

ECMAScript 认可两类对象:原生(Native)对象和宿主(Host)对象,其中宿主对象包含一个被称为内置对象的原生对象的子类(ECMA 262 3rd Ed Section 4.3)。原生对象属于语言,而宿主对象由环境提供,比如说可能是文档对象、DOM 等类似的对象。

原生对象具有松散和动态的命名属性(对于某些实现的内置对象子类别而言,动态性是受限的--但这不是太大的问题)。对象的命名属性用于保存值,该值可以是指向另一个对象(Objects)的引用(在这个意义上说,函数也是对象),也可以是一些基本的数据类型,比如:String、Number、Boolean、Null 或 Undefined。其中比较特殊的是 Undefined 类型,因为可以给对象的属性指定一个 Undefined 类型的值,而不会删除对象的相应属性。而且,该属性只是保存着 undefined 值。

下面简要介绍一下如何设置和读取对象的属性值,并最大程度地体现相应的内部细节。

值的赋予

对象的命名属性可以通过为该命名属性赋值来创建,或重新赋值。即,对于:

var objectRef = new Object(); //创建一个普通的 javascript 对象。

可以通过下面语句来创建名为 “testNumber” 的属性:

objectRef.testNumber = 5;
/* - 或- */
objectRef["testNumber"] = 5;

在赋值之前,对象中没有“testNumber” 属性,但在赋值后,则创建一个属性。之后的任何赋值语句都不需要再创建这个属性,而只会重新设置它的值:

objectRef.testNumber = 8;
/* - 或- */
objectRef["testNumber"] = 8;

稍后我们会介绍,Javascript 对象都有原型(prototypes)属性,而这些原型本身也是对象,因而也可以带有命名的属性。但是,原型对象命名属性的作用并不体现在赋值阶段。同样,在将值赋给其命名属性时,如果对象没有该属性则会创建该命名属性,否则会重设该属性的值。

阅读完整的《Javascript 闭包》

标签:闭包,函数,Javascript
0
投稿

猜你喜欢

  • 浅谈视觉设计的准确性

    2007-09-18 17:59:00
  • CSS布局之浮动(二)三列浮动

    2008-08-19 12:47:00
  • WEB设计经验-来自Microsoft

    2008-05-15 07:30:00
  • MySQL优化之数据类型的使用

    2009-03-16 17:12:00
  • XML编程实例: ASP+XML打造留言本

    2008-10-25 16:35:00
  • IE6局部调用PNG32合并图片

    2009-03-11 21:24:00
  • AJAX打造博客无刷新搜索

    2007-08-23 08:48:00
  • asp 小偷采集程序原理与常用函数方法

    2011-03-06 10:36:00
  • XML简易教程之一

    2008-09-05 17:19:00
  • Oracle 数据库 临时数据的处理方法

    2009-07-02 11:48:00
  • CSS双线边框研究

    2009-09-03 12:12:00
  • MySQL的性能调优工具:比mysqlreport更方便的tuning-primer.sh

    2008-12-08 08:37:00
  • Transact_SQL小手册,适合初学者

    2008-08-25 19:40:00
  • 多个域名后缀同时查询的域名查询系统代码

    2008-05-20 11:53:00
  • Oracle学习笔记(一)

    2012-01-05 18:51:44
  • Firefox插件推荐:CSS Usage

    2009-10-26 18:44:00
  • asp如何正确显示数据库里同时存在的GB码和BIG5编码?

    2010-06-28 18:26:00
  • SQL Server 1069错误(由于登录失败而无法启动服务)解决方法

    2008-09-12 17:35:00
  • 简单的ASP生成HTML并分页程序

    2009-07-20 12:32:00
  • 浅谈Javascript中的事件流和事件绑定

    2009-07-20 17:13:00
  • asp之家 网络编程 m.aspxhome.com