Js的封装和闭包
一直很怀疑自己是否真的懂Js,是不是用Js实现几个选项卡的切换,修改下html的css就算是会了,对于这点,自己都无法认可
今天很想对之前写的Js做个提炼,但对于Js的封装和闭包一直理解不透彻,没法理解,那就只有多写了
Js封装(即面向对象,不懂面向对象思想的同学不用向下看了)
js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但可以利用js的闭包封装机制来实现js类, 封装一个简的CharlesObj类.
function CharlesObj() {
this.show = function(){alert("CharlesObj show");};
this.init = function(){alert("CharlesObj init");};
}
这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的.
这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的.
以下是对封装的js类调用
varcj =newCharlesObj();
cj.show();
cj.init();
这样看来貌似封装也不过如此,但如果我们有在网上找过Js代码或者插件的话,经常会在代码中看到类似这样的代码
(function(){
alert("...");
......
});
这样的代码其实就是所谓的闭包了,那么闭包在js中究竟起个什么作用?
我们如果问朋友或查资料通常得到的都是:闭包就是指变量在某个作用域上的值,这个变量只在这个作用域上起作用。闭包对变量而言,闭包指某个作用域。
一直很奇怪,如果是作用域的问题,完全可以用全局变量和局部变量来解决,为何还专门要搞个闭包出来,这不是闲的蛋疼;
直到前面有次调用百度地图api的实现多覆盖物标注时遇到个问题:
百度地图api提供地图标注功能,但并没有提供根据赋值ID或某唯一标识来区分不同的覆盖物,这就存在一个问题,我们不可能永远在地图上只标一个点,当时第一个想法是创建多个全局变量保存覆盖物对象,这个想法一冒出就觉的要这么干,就太2b了点,继续想别的方法,后来有人说用闭包,在闭包里面直接绑定事件,虽然不怎么理解,但依葫芦画瓢先搞定功能再说,结果当然是目的达到了,但还是不清楚为啥,闭包就行;今天想将js提炼下,前提自然得将这些东东在了解下,不然提炼出来的还是这种垃圾代码!所谓磨刀不误砍柴工,终于让我看到,原来闭包中的值会一直存在于内存中,还是来个demo说明下问题:
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
既然了解了闭包值会一直存在于内存中,那么自然我们不能滥用闭包,否则会大大增加内存的消耗
既然了解了闭包值会一直存在于内存中,那么自然我们不能滥用闭包,否则会大大增加内存的消耗
本文仍是在本人似懂非懂下写的,主要想看下自己究竟是否真正理解,许多东西我们听上去挺简单,但往往我们很久之后还是不会,原因很大一部分是因为我们的动手能力太差,此句仅说给自己听
相关推荐
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
总结来说,“layer.rar”提供的是一种使用JavaScript闭包封装的跨平台提示模态框解决方案,它结合了HTML和CSS的威力,实现了响应式设计,可以在各种设备上提供一致的用户体验。这个工具的使用和实现涉及到了...
总的来说,JavaScript中的模块化、封装、闭包和继承是相辅相成的概念。通过闭包我们可以实现封装,隐藏内部状态,通过构造函数和原型链我们可以实现继承,复用和扩展对象的功能。掌握这些概念,对编写高质量的...
总结起来,理解和掌握JavaScript中的命名空间和闭包对于编写高效、可维护的代码至关重要。通过巧妙地运用这些概念,我们可以更好地管理代码、封装数据、以及实现各种高级功能。在实际开发中,结合现代的模块化方案,...
闭包常常用于封装变量和实现私有方法,提高代码的封装性和安全性。 总结一下,JavaScript中的函数不仅是一种数据类型,还是实现面向对象编程的核心工具。通过原型链,我们可以实现基于原型的继承;通过闭包,我们...
5. **模块化**:在JavaScript的模块系统中,闭包可以帮助创建模块化的功能,每个模块都封装了自己的变量和函数,互不影响。 6. **异步处理**:在异步编程(如回调函数、Promise或async/await)中,闭包可以帮助保存...
它不仅可以帮助我们实现更复杂的功能,还能提高代码的可维护性和封装性。然而,在实际开发过程中,我们也应该注意合理使用闭包,避免出现不必要的性能问题或内存泄漏。希望本文能对你理解JavaScript闭包有所帮助。
JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...
### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一...总之,正确理解和使用闭包对于成为一名合格的JavaScript开发者至关重要。通过闭包,我们可以编写更加灵活、高效且易于维护的代码。
- **模块化编程**:利用闭包可以隐藏变量和函数,只暴露必要的接口,提高代码的封装性。 - **私有变量**:创建只有特定函数可以访问的私有变量。 - **回调函数**:在异步编程中,闭包可以确保回调函数能够访问外部...
总之,JavaScript中的闭包是一个强大而灵活的概念,它提供了对作用域、变量持久化和封装的强大支持,是理解JavaScript核心机制的关键部分。在日常开发中,熟练掌握闭包的使用将有助于编写更高效、更易于维护的代码。
总结,闭包在JavaScript中的应用广泛,特别是在处理异步操作、事件处理、封装私有变量等方面。通过正确理解和运用闭包,开发者可以编写更高效、更灵活的代码,同时避免全局变量污染和其他潜在问题。
Alamofire - swift 代理请求封装,闭包回调封装
JavaScript中的闭包是一种重要的编程概念,它涉及到函数、作用域和变量持久化等多个核心知识点。在深入理解闭包之前,我们需要先了解JavaScript的作用域规则。 1. **作用域**:在JavaScript中,变量的作用域分为两...
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
它们允许我们保存函数的私有状态,避免使用全局变量,从而使代码模块化和封装性更强。但同时,闭包也会带来一些问题,比如潜在的内存泄漏。因为闭包可以访问外部函数的变量,而这些变量通常会在外部函数执行完毕后...
JavaScript中的闭包是一种重要的编程概念,它涉及到函数、作用域和变量持久化等多个核心知识点。闭包的本质是函数能够访问并操作其外部作用域内的变量,即使在其外部作用域已经结束之后仍然能保持对这些变量的访问。...