闭包私有化
It’s a tree falling in the forest with no one around to hear it. ——《你不知道的Javascript(上卷)》
JavaScript中是没有块级作用域的,为了在JavaScript中引入块级作用域,可以使用匿名函数模拟块级作用域。为什么大费周折整出块级作用域呢?因为有了块级作用域,每个开发人员都可以在块级作用域中定义自己的变量,而不用担心会搞乱全局作用域,过多的全局作用域变量核函数会导致命名冲突。匿名函数用作块级作用域被称为私有作用域(private scope),这个匿名函数实际上就是一个闭包,它可以访问自己内部活动对象,函数执行完成即销毁,不占用内存,语法如下:
(function () {
//块级作用域
})();
上述代码首先将函数声明包含在圆括号中,这表示这段代码实际上是一个函数表达式,紧随其后的圆括号会立即调用这个函数。
以下实例表明,私有作用域的变量不可由外部访问。
下面用一实例进行测试
function Person(name,sex){
//私有化变量
var otherName = "Json";
this.name = name;
this.sex = sex;
this.change = function(){
this.name = otherName;
}
this.changeName = function(target){
otherName = target;
}
this.sayName = function(){
console.log(otherName);
}
}
运行结果:
for循环示例:
for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log( i );
}, i*1000 );
}
for (var i=1; i<=5; i++) {
(function() {
var j = i;
setTimeout( function timer() {
console.log( j );
}, j*1000 );
})();
}
相信了解闭包之后这两个的运行结果应该很简单的就能看出来:
第一个结果:
6
6
6
6
6
第二个结果:
1
2
3
4
5