本文关于javascript的内容部分借用《javascript语言精粹》这本书!
<html>
<body></body>
</html>
<script>
//使用闭包来隐藏属性
//通过一个函数的形式去初始化myObject该函数返回一个对象字面亮, 定义了一个value变量,
//该变量对increment和getvalue方法都是可用的,但是函数的作用域使得它对其他的程序来说不是可见的
var myObject = function(){
var value = 2;
return {
increment:function(inc){
value += typeof inc === 'number' ? inc : 1;
return true;
},
getValue:function(){
return value;
}
}
}();
//添加了一个方法 用来测试value是否对get方法可见。
myObject.get = function(){
return value;
}
//console.log(myObject.getValue());
//使用闭包设定对象的属性为私有属性,
//创建一个名为quo的构造函数
//构造出带有get_status方法和status私有属性的一个对象
var quo = function( status ) {
return {
get_status:function(){
return status;
}
};
};
//说明:quo函数设计成无须new来调用, 名字没有首字母大写, 当调用quo的时候 返回包含了get_status方法的一个
//对象 但是get_status 仍然享有访问quo对象的status属性的特权, get_status方法不是访问该参数的一个
//拷贝 它访问的是该参数本身, 因为该函数可以访问它被创建时所处上下文环境, 这被成为闭包。
var myQuo = quo('amazed');
quo('amazed_2');
//属性仅对于myQuo可见
//console.log(myQuo.get_status());
//举例定义一个函数, 它设置一个dom节点为黄色, 然后把它渐变为白色
var fade = function (node) {
var level = 1;
var step = function(){
var hex = level.toString(16);
node.style.backgroundColor = '#ffff' + hex + hex;
if(level < 32){
level += 1;
setTimeout(step, 100);
}
};
setTimeout(step, 100);
}
fade(document.body);
Function.prototype.method = function ( name, func ){
if( ! this.prototype[name] ){
this.prototype[name] = func;
}
return this;
}
//2 模块
//添加一个方法, 替换html字符实体为对应的字符
//可以把它放在全局变量中,但是全局变量是一个大锅, 容易混淆,并且出现异常
//可以把它定义为函数本身,但是运行是有损耗,因为每次函数被执行时候该字面量会被求值一次
//理想的方式 将它放入一个闭包
String.method('deentityify', function(){
var entity = {
quot:'"',
lt : '<',
gt : '>'
};
return function(){
return this.replace(/&([^&:]+);/g, function(a,b){
var r = entity[b];
return typeof r === 'string' ? r : a;
});
}
}());
//注意最后()运算字符 立刻调用刚构造出来的函数,这个调用创建并返回的函数才识deeentityify方法
console.log('test<"test>'.deentityify());
//模块模式的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有
//变量和函数的特权函数,最后返回这个特权函数, 或者把他们保存在一个可访问到的地方
//使用模块可以摒弃全局变量的使用,它能够是信息隐藏, 可用于应用程序的封装 或者构造其他单例对象
//举例2将一个查找数组对应值的方法 闭包,并且放入基本类型,方便使用
Array.method('getArrayKey', function(value){
return function(value){
var arrlen = this.length;
if(arrlen == 0){
return false;
}
for (var i=0; i<arrlen; i++){
if(this[i]===value){
return i;
}
continue;
}
};
}());
var a = [1,2,3,5];
console.log(a.getArrayKey(5));
//模块模式也可以用来产生安全的对象,
//举例 生成一个序列号的对象
var serial_maker = function(){
var prefix = '';
var seq = 0;
return {
set_prefix: function(p){
prefix = String(p);
},
set_seq : function(s){
seq = s;
},
gensym : function(){
var result = prefix + seq;
seq+=1;
return result;
}
};
};
var seger = serial_maker();
seger.set_prefix("Q");
seger.set_seq(1000);
console.log(seger.seq)//undefined闭包产生的属性是私有属性。 重新构建就会重新生成 ,无法改变
//prefix 和 seq 除非调用对应方法
console.log(seger.gensym())
</script>
分享到:
相关推荐
- **模块化编程**:利用闭包可以隐藏变量和函数,只暴露必要的接口,提高代码的封装性。 - **私有变量**:创建只有特定函数可以访问的私有变量。 - **回调函数**:在异步编程中,闭包可以确保回调函数能够访问外部...
在高级使用中,闭包可以用于实现模块化、数据封装、方法扩展和重载、以及创建私有变量。下面将详细解释这些概念,并结合给出的实例进行解析。 1. **模块化**: 通过闭包,我们可以创建一个独立的命名空间,避免...
闭包可以用来创建私有变量,防止变量在全局作用域被访问和修改,这在模块化和封装变量时非常有用。 要熟练掌握JavaScript闭包,需要通过实际代码的编写和练习来加深理解。创建闭包的基本方法是定义一个函数,然后在...
闭包是JavaScript编程中的一个重要特性,它提供了创建私有变量、管理作用域和记忆化等强大功能,使得JavaScript编程更加灵活和高效。然而,由于闭包会延长变量的生命周期,因此需要合理管理内存使用,避免造成内存...
JavaScript 闭包是一种高级编程概念,它在JavaScript中扮演着至关重要的角色,特别是在函数式编程和模块化设计中。闭包本质上是函数和其能够访问的变量(包括局部变量)的组合,即使函数已经执行完毕,这些变量仍然...
1. **模块化**:通过闭包创建私有变量和函数,实现模块间的隔离。 2. **数据持久化**:在异步操作中,闭包可以保持状态,例如定时器回调中的变量。 3. **内存管理**:通过闭包,可以避免过早释放某些需要长期使用的...
总的来说,闭包是JavaScript中强大且灵活的工具,用于实现封装、数据隐私以及模块化等高级编程模式。尽管使用时需谨慎,以防止内存问题,但正确掌握和利用闭包,能够显著提高代码质量及可维护性。
更复杂的是,可以使用`new Function`构造函数创建函数,或者定义匿名函数,如`(function(){ //TODO here})()`,这常用于模块化隔离。内嵌函数(内部函数)允许访问外部函数的变量,这是闭包的基础。 当我们谈论函数...
4. **模块化**:闭包可以作为实现模块化的手段,每个模块通过闭包来封装其内部逻辑和状态,对外暴露有限的接口,从而实现代码的隔离和复用。 5. **异步编程**:在处理异步操作如定时器、回调函数等时,闭包可以用来...
JavaScript 闭包是一种重要的编程概念,它涉及到函数和作用域的深入理解。闭包的本质是函数内部能够访问并保持对外部变量的引用,即使在函数执行完毕...在实际编程中,闭包经常用于模块化、事件处理、动画控制等场景。
此外,JavaScript的模块化还支持单例模式,即整个应用程序只存在一个模块实例。在示例中,通过立即调用`CoolModule`并将其结果赋值给`foo`,就创建了一个单例模块。这样,每次尝试访问或修改`foo`时,都只会操作同一...
它涉及到函数、作用域和变量持久化等多个方面,对于提升代码质量、实现模块化以及优化内存管理至关重要。本文将深入探讨JavaScript闭包的概念、工作原理及其常见用途。 首先,我们需要了解JavaScript的作用域。在...
1. 数据封装:利用闭包,开发者可以在函数内部创建私有变量,这些变量对外部代码不可见,但可以在内部函数中自由使用和修改。这种方式常用于实现单例模式或模拟类的私有属性。 2. 模块化:JavaScript的模块化设计常...
3. **模块化**:闭包可以作为创建模块化代码的一种手段,通过返回内部函数,外部只能访问到模块提供的接口,而不能直接访问模块内部的实现细节。 4. **函数工厂**:闭包可以用于创建可复用的函数,每个函数都带有...
理解并掌握JavaScript闭包是成为专业前端开发者的关键一步。在实际开发中,合理利用闭包可以提高代码的复用性和可维护性,同时也能避免一些常见的编程陷阱。通过深入学习和实践,可以更好地运用闭包这一强大的工具来...
- **模块化**:闭包常用于创建私有作用域,实现模块化,防止全局变量污染。 - **数据封装**:通过闭包可以创建只读或只写的私有变量,实现数据保护。 - **记忆化**:在函数式编程中,闭包可以用来缓存计算结果,...
### JavaScript闭包详解 #### 引言 JavaScript作为一种动态、弱类型的编程语言,在Web开发领域占据了举足轻重的地位。其中,“闭包”是JS语言中一个非常重要的概念,它不仅能够帮助开发者实现某些特殊的功能,如...
### JavaScript闭包详解 #### 一、闭包的定义与概念 闭包是JavaScript中一个非常重要的概念,它涉及到函数作用域以及变量的作用域链。简单来说,闭包就是一个能够访问其外部作用域中变量的函数。具体而言,当一个...
这种特性使得闭包在JavaScript中具有广泛的应用,如数据封装、模块化、异步操作等。 首先,我们要理解JavaScript的作用域。JavaScript是静态作用域语言,这意味着函数在定义时就决定了它可以访问哪些变量,而不是在...