栏目导航
热点推荐
- 24小时退弹一次的代码,可弹SP2S
- (Tips&Tricks;)用客户端模板精简J
- js教程:JavaScript作用域(Scope)
- window.location.hash的应用及浏
- JavaScript教程:伸缩菜单的制作
- JavaScript强制类型转换函数
- 如何提升JavaScript函数的运行速
- javascript修正12个浏览器兼容问
- 如何走出JavaScript初学困境
- JScript 字母顺序的关键字列表
- JavaScript技巧与高级特性
- JavaScript和Java的区别详细说明
阅览排行
JavaScript技巧与高级特性
www.jz123.cn 2008-12-31 来源: 中国建站 编辑整理 我要投递新闻
这个时候典型的做法是只在全局对象中保存一个对象,所有的功能都通过引用此对象来完成。完成功能所需要的内部状态都封装在一个闭包中。如代码清单 11所示。
清单 11. 使用闭包避免名称空间冲突
(function() {
if (typeof MyCode === "undefined") {
var defaultName = "Alex";
MyCode = {
"sayHello" : function(name) {
alert("Hello, " + (name || defaultName));
}
};
}
})();
MyCode.sayHello(); // 输出为 Hello, Alex
MyCode.sayHello("Bob"); // 输出为 Hello, Bob
代码中通过创建一个匿名 function 并立即执行来生成一个闭包。在闭包中,通过修改全局对象MyCode来添加所需的功能。内部状态之一的属性defaultName被封装在闭包中,不能被闭包之外的代码所引用,也不会引发命名冲突。
保存状态
在 JavaScript 代码运行过程中,不可避免的需要保存一些内部状态。通过使用闭包,可以将内部状态封装在一个 function 内部,使得代码更加简洁。如代码清单 12所示。
var getNextId = (function() {
var id = 1;
return function() {
return id++;
}
})();
getNextId(); // 输出 1
getNextId(); // 输出 2
getNextId(); // 输出 3
代码中的getNextId的功能是生成惟一的 ID,因此它需要维护当前的 ID 这样一个状态。通过使用闭包,不需要在全局对象中添加一个新的属性,该属性由闭包来维护。闭包之外的代码也不能访问或修改getNextId的内部状态。
折叠调用参数
在 JavaScript 中,有些 function,如setTimeout和setInterval,只接受一个 function 作为参数。在有些情况下,这些 function 的执行是需要额外的参数的。这个时候可以通过使用闭包,将原始 function 的参数进行折叠,得到一个没有参数的新 function 。如代码清单 13所示。
function doSomething(a, b, c) {
alert(a + b + c);
}
function fold(a, b, c) {
return function() {
doSomething(a, b, c);
}
}
var newFunc = fold("Hello", " ", "World");
setTimeout(newFunc, 1000); // 输出为 Hello World
代码中的doSomething需要三个参数来完成其功能。如果直接将doSomething传给setTimeout的话,三个参数的值都是 undefined 。fold将三个参数的值保存在激活对象,并添加在作用域链中。这样即便返回的 function 是没有参数的,它仍然可以获得这三个参数的值。
关于闭包的更多内容,请参见参考资料。
上一篇:javascript中如何确定undefine 下一篇:JavaScript Throw教程