对 "闭包-closure" 的一些见解http://wj.cnblogs.com/archive/2006/04/22/381851.html
来源:互联网 发布:创远家居装修系统源码 编辑:程序博客网 时间:2024/04/30 17:00
导读:
今天在群里面瞎谈,就谈到“闭包”上来了,何种语言支持闭包?自己g下吧,其中JavaScript是支持闭包概念的一种语言/脚本(?)。以下是我对他的见解(以javascript举例)。
先了解下在一个对象内如何声明变量,一下以Test对象为例:
Public变量:
function Test()
{
this.x = 1}
或者
Test.prototype.x = 1
公共变量简而言之,外界对象可以对公共变量访问,并且公共变量可以在对象的构造函数中声明外,还可以在对象的prototype成员中声明。换句话说,你可以在任何时候添加公共变量(利用prototype)。prototype是一个特别的成员变量,js就是利用这个成员变量的特性来实现继承的。当一个成员被检索且没有在对象中发现的时候,那么它就会从对象构造器的prototype成员中获取他。如果要从外界调用这个对象的方法,或者是通过这个方法操作这个对象里面的所有成员,你可以通过prototype加入:
Test.prototype.Plus = function () {
}
Private变量:
function Test()
{
var self = this
var x = 1
function Plus1() {
}
var pPlus = function Plus2() {
}
}
私有的变量只能由成员的私有方法或者是特权方法(Privileged,下面讲到)访问,需要注意的是,上面的Plus1()这个方法和pPlus()这个方法是一样的,只是声明的方式不通而已,他们都是私有方法,他和特权变量的声明方法很相似,只是少了个this多了个var,但是他们是不同的,应该特别注意。另外一点是,私有变量是在无法被外界访问的同时,他也不能由对象的公共方法访问。私有方法只是在构造函数内的内部方法。私有变量只能在构造函数中声明。
Privileged变量:
function Test()
{
this.pPlus = function () {
}
}
什么叫Privileged(特权)变量呢?特权方法可以访问私有方法和私有变量,同时他对外界是可见的。你可以重新声明这个私有方法或者是删除他(重新对这个特权方法赋值,null值表示删除),但是不能改变他。特权变量也只能在构造函数中声明。
好了,对象声明介绍到这里,这些声明模式都是由js的closure(闭包)特性所支持的,下面介绍闭包。
在一个闭包内,你可以暂且(?)理解成在构造函数内,内部函数总是可以访问函数外部的变量和参数的。就算在内部函数return后,闭包内的所有变量都会被保存起来,就好像一个上下文一样。下面我以一个例子说明这个问题,例子来源在群内,由YOK提供(例子已经被修改,只是用来简单说明问题)。
说明:按test按钮输出相加的值,期望值为3。
运行例子,但是输出"NaN"。这是什么问题呢,我最初调试的时候,以为是this的问题,我原本理解成在add方法中this是指向test按钮(其实this指向window对象),而他不包含x和y的两个变量,所以输出错误。首先,这个理解是正确的,但是你要如何修改才能获取正确的结果呢。我们已经知道,在Test构造函数中,我们声明的x,y是两个私有变量,你不可能在外部访问到,所以必须另觅他路。我们利用特权变量来解决。
上面呈现的是闭包的其中一个特性,下面用来说他的另外一个特性。
每次输出,值都会增加1,说明闭包内上下文就算add方法return后都会被保存。
最后说下怎么动态替换行为(这里是按钮click的行为)。
以上是我对他的一点见解,closure是js的一个特性而已,我们可以利用这个特性使设计更灵活,其他语言,我google到的好像叫Lua,不知道他是什么,他也支持。由于对js了解不深,请高手斧正确,enjoy it~~~ :)
本文转自
http://wj.cnblogs.com/archive/2006/04/22/381851.html
今天在群里面瞎谈,就谈到“闭包”上来了,何种语言支持闭包?自己g下吧,其中JavaScript是支持闭包概念的一种语言/脚本(?)。以下是我对他的见解(以javascript举例)。
先了解下在一个对象内如何声明变量,一下以Test对象为例:
Public变量:
function Test()
{
this.x = 1}
或者
Test.prototype.x = 1
公共变量简而言之,外界对象可以对公共变量访问,并且公共变量可以在对象的构造函数中声明外,还可以在对象的prototype成员中声明。换句话说,你可以在任何时候添加公共变量(利用prototype)。prototype是一个特别的成员变量,js就是利用这个成员变量的特性来实现继承的。当一个成员被检索且没有在对象中发现的时候,那么它就会从对象构造器的prototype成员中获取他。如果要从外界调用这个对象的方法,或者是通过这个方法操作这个对象里面的所有成员,你可以通过prototype加入:
Test.prototype.Plus = function () {
}
Private变量:
function Test()
{
var self = this
var x = 1
function Plus1() {
}
var pPlus = function Plus2() {
}
}
私有的变量只能由成员的私有方法或者是特权方法(Privileged,下面讲到)访问,需要注意的是,上面的Plus1()这个方法和pPlus()这个方法是一样的,只是声明的方式不通而已,他们都是私有方法,他和特权变量的声明方法很相似,只是少了个this多了个var,但是他们是不同的,应该特别注意。另外一点是,私有变量是在无法被外界访问的同时,他也不能由对象的公共方法访问。私有方法只是在构造函数内的内部方法。私有变量只能在构造函数中声明。
Privileged变量:
function Test()
{
this.pPlus = function () {
}
}
什么叫Privileged(特权)变量呢?特权方法可以访问私有方法和私有变量,同时他对外界是可见的。你可以重新声明这个私有方法或者是删除他(重新对这个特权方法赋值,null值表示删除),但是不能改变他。特权变量也只能在构造函数中声明。
好了,对象声明介绍到这里,这些声明模式都是由js的closure(闭包)特性所支持的,下面介绍闭包。
在一个闭包内,你可以暂且(?)理解成在构造函数内,内部函数总是可以访问函数外部的变量和参数的。就算在内部函数return后,闭包内的所有变量都会被保存起来,就好像一个上下文一样。下面我以一个例子说明这个问题,例子来源在群内,由YOK提供(例子已经被修改,只是用来简单说明问题)。
说明:按test按钮输出相加的值,期望值为3。
运行例子,但是输出"NaN"。这是什么问题呢,我最初调试的时候,以为是this的问题,我原本理解成在add方法中this是指向test按钮(其实this指向window对象),而他不包含x和y的两个变量,所以输出错误。首先,这个理解是正确的,但是你要如何修改才能获取正确的结果呢。我们已经知道,在Test构造函数中,我们声明的x,y是两个私有变量,你不可能在外部访问到,所以必须另觅他路。我们利用特权变量来解决。
上面呈现的是闭包的其中一个特性,下面用来说他的另外一个特性。
每次输出,值都会增加1,说明闭包内上下文就算add方法return后都会被保存。
最后说下怎么动态替换行为(这里是按钮click的行为)。
以上是我对他的一点见解,closure是js的一个特性而已,我们可以利用这个特性使设计更灵活,其他语言,我google到的好像叫Lua,不知道他是什么,他也支持。由于对js了解不深,请高手斧正确,enjoy it~~~ :)
本文转自
http://wj.cnblogs.com/archive/2006/04/22/381851.html
- 对 "闭包-closure" 的一些见解http://wj.cnblogs.com/archive/2006/04/22/381851.html
- 对 "闭包-closure" 的一些见解
- http://index.cnblogs.com/archive/2006/04/12/57904.html
- 对WebService的一些封装技巧总结(http://www.cnblogs.com/sxwgf/archive/2011/07/10/something-about-webservice.html
- 发布一套JAVASCRIPT控制的WEBGIS源码http://www.cnblogs.com/huzhiming-2006/archive/2007/04/25/727325.html
- ASP常用的函数模块 http://www.cnblogs.com/cnnix/archive/2006/07/16/452286.html
- web录音的实现 http://www.cnblogs.com/jianyi0115/archive/2008/02/22/1078133.html
- Linux进程调度的目标 http://www.cnblogs.com/zhaoyl/archive/2012/09/04/2671156.html
- Office 2007 AddIn的安装包的制作 http://www.cnblogs.com/yunhuasheng/archive/2008/01/05/1027115.html
- http://www.cnblogs.com/ltp/archive/2006/04/17/377564.html
- http://www.cnblogs.com/zhbsh/archive/2013/04/22/3035477.html
- 一些在JAVA中获得文件夹路径的方法http://www.cnblogs.com/lostyue/archive/2011/06/27/2091686.html
- 在ASP.NET 2.0中开发通配符映射应用程序的一些问题 (转自:http://www.cnblogs.com/dudu/archive/2006/03/07/345107.html)
- HTTP协议的chunked编码 http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html
- 七款HTML在线编辑器[下载] http://ding0910.cnblogs.com/archive/2006/02/25/337548.html
- HTTP报文 http://www.cnblogs.com/kissdodog/archive/2013/04/01/2993228.html
- gcc和g++的区别(很详细的描述) http://www.cnblogs.com/joeblackzqq/archive/2011/04/13/2014404.html
- 分享42个精美的免费PSD素材(转http://www.cnblogs.com/lhb25/archive/2011/02/22/1960203.html)
- [SOA介绍]什么是SOA
- Asp连接Sql数据库或者Access函数
- 闭包(Closures)在各种语言中的例子 http://blog.csdn.net/ruby_cn/archive/2004/11/23/192588.aspx
- Asp关闭数据库连接函数
- PHP常见问题汇总
- 对 "闭包-closure" 的一些见解http://wj.cnblogs.com/archive/2006/04/22/381851.html
- 华为收购港湾核心业务 有恶意收购嫌疑
- 广州番禺大夫山森林公园游记
- 在Javascript中,什么是闭包(Closure)
- 开发网页程序的时候,JS经常报错该如何处理?
- 第五次作业
- ubuntu下开机自动运行脚本以及定时任务的处理
- 如何取得当前数据的上一条和下一条的ID
- Flex 应用展示之 BEST4C 在线绘图工具