惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
S
SegmentFault 最新的问题
V
Visual Studio Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
美团技术团队
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
有赞技术团队
有赞技术团队
量子位
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
博客园 - 叶小钗
月光博客
月光博客
P
Proofpoint News Feed
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog

博客园 - 滋心

为hover事件加上延迟 面向对象的JavaScript(1):创建简单的类 JQuery画细线表格 自定义控件验证页面所有文本框 - 滋心 - 博客园 LinQ in Action 笔记三:Hello LINQ to SQL LinQ in Action 笔记二:Hello LINQ to XML LinQ in Action 笔记一、Hello LINQ to Objects JQuery选择器插件 Extra selectors JQuery选择器 - 滋心 - 博客园 利用Repeater控件显示主-从关系数据表 查询表结构 Sqlserver建立和另外数据库的连接 XPath实例教程十九、ancestor-or-self 轴(axis)包含上下文节点本身和该节点的祖先节点 XPath实例教程十八、descendant-or-self 轴 XPath实例教程十七、preceding轴 XPath实例教程十六、following轴 XPath实例教程十五、preceding-sibling 轴 XPath实例教程十四、following-sibling轴 XPath实例教程十三、ancestor轴
面向对象的JavaScript(2)闭包
滋心 · 2009-08-29 · via 博客园 - 滋心

在讨论私有属性和方法的实现之前,我们先了解一下Javascript中的一个概念“闭包”
 什么是“闭包”呢?我们先来看一个例子

function Class1(){
    
var a = 10;
    
function Class2(){
        a
++;
    }
    Class2();
    
return a;
}
var class1 = new Class1();
alert(class1);

a是定义在函数Class1中私有变量,但是我们可以通过Class2访问它,这个比较好理解,但是如果我们是在Class1的外部来调用Class2呢?

function Class1(){
    
var a = 10;
    
function Class2(){
        a
++;
        
return a;
    }
    
return Class2;
}
var class1 = new Class1();
alert(class1());    
//11
alert(class1());    //12

我们可以看到它仍然能够访问变量a
从上面的例子可以看到在JavaScript函数是运行在定义他们的作用域中(本例中的Class1内部),而不是运行在调用他们的作用域中
只要Class2定义在Class1中,它就能访问Class1中所定义的所有变量
这就形成了一个“闭包”
你可能会问,这有什么用呢?,答案是“什么都可以做”
下面我们来看一个简单例子,我们都知道setTimeout函数用于延时触发函数

function aaa(){
    alert(
1+2);
}

setTimeout(aaa(),

10000);

这个例子很简单,将在10秒后弹出对话框"3"
如果,我们想让函数灵活一些,通过参数弹出相应的数字,你可能会这样写

function aaa(a,b){
    alert(a
+b);
}

setTimeout(aaa(

1,2),10000);

很不幸,这样做,不会延迟10秒,而是马上就弹出了“3”
下面我们再次改造上面的代码,我们将创建一个闭包,将要延时执行的函数放到闭包中

function aaa(a, b){
    
return (function(){
        alert(a 
+ b);
   });
}

setTimeout(aaa(

1,2),10000);

OK,这样就能延迟的执行传参的函数了
这只是使用“闭包”的一个很简单的例子,下一节,我们将使用“闭包”来创建一个有私有字段和函数的类

扩展阅读:
Javascript 闭包

参考书目:
《JavaScript权威指南》
《JavaScritp高级程序设计》
《JavaScript设计模式》