延迟调用
setTimeout 函数允许在指定时间之后在全局对象(window 对象)里执行一个无参数函数。利用闭包的特性,我们就可以给这个函数传递参数。
命名空间
闭包包含了函数代码和绑定了自由变量的计算环境,这个环境就可以给函数提供一个私有的命名空间。这个特性可以用在很多情况下。例如一个字符串解析函数需要一个特殊字符列表,如果把这个列表定义在函数体中,那么每次调用这个函数的时候都要重新初始化一次特殊字符列表。有两种方法可以避免这种重复计算,一是把特殊字符列表定义成全局的变量。但这样至少会产生两个问题,污染了全局命名空间,同时这个全局变量在任何地方都可以被修改。第二种方法就是利用闭包,示例代码如下。
这样,不管调用多少次 parse 函数,特殊字符列表都不会重新初始化了,而且外部任何地方都无法访问这个列表。
通过闭包可以做什么,以上只是举两个比较常见的例子,有一篇文章说闭包什么都可以做。有的时候不用闭包可能也可以实现相应的功能,但闭包使 JavaScript 变得更加灵活,可以让你写出更加优雅的代码。要详细解答这个问题要通过大量的实践和总结了,我们只要对它的原理理解了,平时开发的时候多思考,就知道该不该用闭包了。
-EOF-
setTimeout 函数允许在指定时间之后在全局对象(window 对象)里执行一个无参数函数。利用闭包的特性,我们就可以给这个函数传递参数。
function dosomething(param) {
return (function() {
//这里可以得到 param 这个参数
alert(param);
});
}
setTimeout(dosomething('参数'), 1000);
命名空间
闭包包含了函数代码和绑定了自由变量的计算环境,这个环境就可以给函数提供一个私有的命名空间。这个特性可以用在很多情况下。例如一个字符串解析函数需要一个特殊字符列表,如果把这个列表定义在函数体中,那么每次调用这个函数的时候都要重新初始化一次特殊字符列表。有两种方法可以避免这种重复计算,一是把特殊字符列表定义成全局的变量。但这样至少会产生两个问题,污染了全局命名空间,同时这个全局变量在任何地方都可以被修改。第二种方法就是利用闭包,示例代码如下。
var parse = function(){
var list = ['t', 'n', '\' /* other */];
return function(str /* 要解析的目标字符串 */) {
//do parse
};
}();
parse('hello');
这样,不管调用多少次 parse 函数,特殊字符列表都不会重新初始化了,而且外部任何地方都无法访问这个列表。
通过闭包可以做什么,以上只是举两个比较常见的例子,有一篇文章说闭包什么都可以做。有的时候不用闭包可能也可以实现相应的功能,但闭包使 JavaScript 变得更加灵活,可以让你写出更加优雅的代码。要详细解答这个问题要通过大量的实践和总结了,我们只要对它的原理理解了,平时开发的时候多思考,就知道该不该用闭包了。
-EOF-