`
toknowme
  • 浏览: 139908 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

班门弄斧02:Javascript闭包,实践篇

 
阅读更多

闭包是 函数的局部变量集合,并且集合中的元素滞留在堆栈中,在函数返回后不会释放

在javascript中function 也是变量,记住这两点,闭包就理解了(感谢wusir的大力指导~)


假设我们现在要做一个关于电影操作的闭包练习,分析如下:
(1) 属性:电影名称,上映时间,票房
(2)动作:新增,删除,修改,查询电影

第一步:搭建闭包的架子

<script type="text/javascript">

var Movie = (
function() {
return function () {

}
}
)();

</script>

第二步:
(1)假设我们的代码封装在js中,让别人调用
(2)_ZMovie闭包函数承载的对象,其实是个函数
(3)真正让用户直接使用的是执行_ZMovie()函数后的对象,ZMovie

<script type="text/javascript">

var _ZMovie = (
function() {//1.定义的匿名函数体,就是外围函数
var movie = new Object();//2.外围函数中的变量,外部是无法访问的
return function () {//3.返回的是一个内部函数体,一旦执行了这个内部函数体,我们返回的就是一个对象,这边有点难以理解
var _datas = new Array();
var movie_add = function (_name,_date,_office) {
movie.name = _name;
movie.date = _date;
movie.office = _office;

_datas[0] = movie;
}
movie.add = movie_add;
movie.datas = _datas;

return movie;
}
}
)();

var ZMovie = _ZMovie();
ZMovie.add('神探夏洛克','2014-01-05',1000000);
var datas = ZMovie.datas;
for(var i = 0; i < datas.length; i++) {
alert(datas[i].name);
alert(datas[i].date);
alert(datas[i].office);
}

</script>

写这个例子的时候,自己也是瞎拼凑出来的,存在的BUG和其他方法未写,大体的架子搭好,待续!
2014.01.05 01:51





<script type="text/javascript">
var _ZMovie = (function() {//1.定义的匿名函数体,就是外围函数
var movie = new Object();//2.外围函数中的变量,外部是无法访问的
var _datas = new Array();
return function() {//3.返回的是一个内部函数体,一旦执行了这个内部函数体,我们返回的就是一个对象,这边有点难以理解
var movie_add = function(_id, _name, _date, _office) {
var _m = new Object();
_m.id = _id;
_m.name = _name;
_m.date = _date;
_m.office = _office;

_datas[(_datas.length++)] = _m;
};

var movie_delete = function (queryJSON){
var rtnArray = new Array();
var queryArray = eval("("+queryJSON+")");//转换为json对象
if(queryArray != null && queryArray.length > 0) {

}
};

movie.addMovie = movie_add;
movie.deleteMovie = movie_delete;//delete为关键字
movie.datas = _datas;

return movie;
}
})();

var ZMovie = _ZMovie();
ZMovie.addMovie(1,'蝙蝠侠前传1:侠影之谜', '2014-01-05', 1000000);
ZMovie.addMovie(2,'蝙蝠侠前传2:黑暗骑士', '2014-01-05', 1000000);
ZMovie.addMovie(2,'蝙蝠侠前传2:黑暗骑士崛起', '2014-01-05', 1000000);
var datas = ZMovie.datas;
for ( var i = 0; i < datas.length; i++) {
alert(datas[i].id+"|"+datas[i].name+"|"+datas[i].date+"|"+datas[i].office);
}
ZMovie.deleteMovie("[{'id':1}]")
</script>

删除的方法待修改,待续!
2014.01.06 11:15

对于删除,采用了给对象增加【逻辑状态】的内部属性实现
1.这边需要注意的是json对象也是有办法取出其key,并且通过key获取对应的值,
2.对于对象取值可以通过obj[属性的方法]获取值

<script type="text/javascript">
var _ZMovie = (function() {//1.定义的匿名函数体,就是外围函数
var movie = new Object();//2.外围函数中的变量,外部是无法访问的
var _datas = new Array();
return function() {//3.返回的是一个内部函数体,一旦执行了这个内部函数体,我们返回的就是一个对象,这边有点难以理解
var movie_add = function(_id, _name, _date, _office) {
var _m = new Object();
_m.id = _id;
_m.name = _name;
_m.date = _date;
_m.office = _office;
_m._state = 'U';

_datas[(_datas.length++)] = _m;
};

var movie_delete = function(queryJSON) {
var rtnArray = new Array();
var queryObj = eval("(" + queryJSON + ")");//转换为json对象
if (queryObj != null) {
for ( var key in queryObj) {
for ( var i = 0; i < this.datas.length; i++) {
if (this.datas[i][key] == queryObj[key]) {
this.datas[i]._state = 'E';
}
}
}
}
};

var movie_query = function () {
var rtnArray = new Array();
var j = 0;
for(var i = 0; i < this.datas.length; i++) {
if(this.datas[i]._state == 'U') {
rtnArray[j++] = this.datas[i];
}
}
return rtnArray;
};

movie.addMovie = movie_add;
movie.deleteMovie = movie_delete;//delete为关键字
movie.queryMovie = movie_query;
movie.datas = _datas;

return movie;
}
})();

var ZMovie = _ZMovie();
ZMovie.addMovie(1, '蝙蝠侠前传1:侠影之谜', '2014-01-05', 1000000);
ZMovie.addMovie(2, '蝙蝠侠前传2:黑暗骑士', '2014-01-05', 1000000);
ZMovie.addMovie(3, '蝙蝠侠前传3:黑暗骑士崛起', '2014-01-05', 1000000);
var datas = ZMovie.queryMovie();

for ( var i = 0; i < datas.length; i++) {
alert(datas[i].id + "|" + datas[i].name + "|" + datas[i].date + "|"
+ datas[i].office + "|" + datas[i]._state);
}

ZMovie.deleteMovie("{'id':1}");

var datas = ZMovie.queryMovie();

for ( var i = 0; i < datas.length; i++) {
alert(datas[i].id + "|" + datas[i].name + "|" + datas[i].date + "|"
+ datas[i].office + "|" + datas[i]._state);
}
</script>

javascript的闭包总结:
概念(专业):闭包是 函数的局部变量集合,并且集合中的元素滞留在堆栈中,在函数返回后不会释放
概念(通俗):
第一层理解:就是将内部变量呈现到全局的方法
第二层理解:结合java对象进行讲解,比如某个业务层对外提供的方法可能只有几个,也就是我们所关心的,但是我们并不关注这些业务逻辑使用到了那些属性以及时如何实现的,便于我们更好的协同运作,那么我们怎么在js中实现呢,就是一个又一个对外提供的js文件,这个时候我们可以使用闭包实现,比如我们例子中的Movie对象,我们可能就是新增,删除,查询等操作,我们可能也就是关心这些方法,但是对于他的属性(可能我们还需要一些特定的属性,比如逻辑状态)我们是不关心的,所以闭包就是封装住了内部属性,对外提供一些可用方法进行操作!

 

5
8
分享到:
评论

相关推荐

    javascript闭包详解中文word版

    资源名称:javascript闭包详解 中文word版   内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...

    JavaScript闭包(closure).pdf

    JavaScript中的闭包是一种高级特性,它是函数和其周围状态(词法作用域)的组合,即使函数在其定义的作用域之外被调用,它仍然能访问到这些状态。这个概念是JavaScript编程中的核心部分,尤其在处理异步操作、模块化...

    基于JavaScript闭包的Web图片浏览控件的实现.pdf

    基于JavaScript闭包的Web图片浏览控件的实现 本文主要讲解了基于JavaScript闭包原理的Web图片浏览控件的实现,包括JavaScript闭包概念、闭包应用场景、Web图片浏览控件的设计思路和实现方法。 1. JavaScript闭包...

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    JavaScript闭包研究及典型应用.pdf

    JavaScript 闭包研究及典型应用 JavaScript 闭包是一种强大的技术,能够在各种场景中发挥重要作用。本文将介绍 JavaScript 闭包的定义、使用场景和典型应用。 闭包函数的定义和使用场景 在 JavaScript 语言中,...

    javascript 闭包

    JavaScript 闭包是一种重要的编程概念,它涉及到函数和作用域的深入理解。闭包的本质是函数内部能够访问并保持对外部变量的引用,即使在函数执行完毕后,这些变量仍然可被内部函数访问和操作。这使得闭包成为实现...

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ...

    javaScript闭包技术资料

    ### JavaScript闭包技术详解 #### 一、闭包的基本概念 **闭包**是JavaScript中一个重要的概念,它涉及到函数的执行环境、作用域链等关键要素。简单来说,闭包是一个函数及其相关的引用环境的组合。具体而言,当一...

    深入解析Javascript闭包的功能及实现方法

    JavaScript中的闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数已经执行完毕后。闭包的实现基于JavaScript的作用域链和垃圾回收机制。 1. **闭包的概念** 闭包是一个拥有自身...

    闭包javascript.pdf

    标签:javascript 闭包 从给定的文件信息来看,主要围绕JavaScript中的闭包概念进行深入探讨。闭包是计算机科学中一个重要的概念,特别是在函数式编程语言中,如JavaScript,它允许一个函数在定义时捕获并记住其...

    基于javascript 闭包基础分享

    在JavaScript编程中,闭包是一个核心概念,它允许函数记住并访问所在词法作用域,即使当函数在其词法作用域之外执行时。闭包的特性使得它在JavaScript中既神秘又强大。 首先,我们从闭包的定义谈起。在JavaScript中...

    Javascript闭包实例详解

    JavaScript中的闭包是一种重要的编程概念,它涉及到函数、作用域和变量持久化。闭包本质上是函数能够记住并访问其词法作用域内的变量,即使该函数已经执行完毕且其外部作用域不再存在。这种特性使得闭包成为...

    javascript闭包的高级使用方法实例

    JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域中的变量,即使在外部函数执行完毕后,这些变量仍然保持活动状态。在高级使用中,闭包可以用于实现模块化、数据封装、方法扩展和重载、以及创建...

    javascript 闭包实例下载

    JavaScript 闭包是一种高级编程概念,它在JavaScript中扮演着至关重要的角色,特别是在函数式编程和模块化设计中。闭包本质上是函数和其能够访问的变量(包括局部变量)的组合,即使函数已经执行完毕,这些变量仍然...

    揭开Javascript闭包的真实面目

    【JavaScript 闭包详解】 闭包是JavaScript编程中一个核心且关键的概念,尤其对于初学者而言,理解起来可能有些挑战。闭包本质上是一种特殊的作用域,它可以捕获并存储其外部函数作用域内的变量,即使外部函数已经...

    深入理解_JavaScript_闭包

    JavaScript 闭包是编程语言中的一个关键概念,尤其在JavaScript中有着重要的应用。它涉及到函数、作用域和变量持久化等多个方面,对于提升代码质量、实现模块化以及优化内存管理至关重要。本文将深入探讨JavaScript...

    javascript in action:javascript 实战源码

    5. **原型与继承**:JavaScript使用原型链实现对象继承,掌握如何通过构造函数、原型对象和Object.create方法实现继承关系。 6. **面向对象编程**:了解如何通过类(class)和实例(instance)进行面向对象编程,...

    javaScript闭包的理解

    ### JavaScript闭包的理解 #### 一、闭包的定义与特点 闭包是JavaScript中一个非常重要的概念,它指的是一个函数能够访问并操作其外部作用域中的变量的能力。这一特性使得JavaScript具有了一些其他语言不具备的...

    javascript闭包详解

    - **闭包的本质**:JavaScript中任何函数都是一个闭包,但当我们提到“闭包”时,通常指的是那些能够访问到外部作用域变量的嵌套函数。 - **闭包的特点**:当一个函数(内部函数)被另一个函数(外部函数)中的变量...

Global site tag (gtag.js) - Google Analytics