闭包的概念
今天就和大家说一下什么是闭包,在javascript中闭包的应用非常广泛,就看你能不能get到其中的重点。通过相关资料的阅读和整理,总结了闭包的概念如下:
概念:简单地说,闭包就是在函数的内部声明的函数(即可理解为闭包就是innerFn函数)。
闭包本质:闭包的本质就是可以让函数(innerFn)外部作用域访问到在函数(innerFn)声明时所在作用域中的所有变量以及其他函数。闭包是将函数内部和函数外部链接起来的桥梁。
var globalVariable = '我是全局变量';
function outerFn () { // 外部函数
var localVariable = '我是局部变量';
return function innerFn () { // 内部函数
console.log(globalVariable);
console.log(localVariable);
}
}
// 外部作用域中不能访问内部作用域中的变量
// console.log(localVariable); // 错误
var ref = outerFn(); // 将闭包的引用赋值给ref,即在内存中会保存定义innerFn时的作用域
ref();
闭包的作用
- 在函数外读取函数内部的变量
- 变量的值始终保持在内存中
// 证明内部变量一直存在内存中
// 在全局作用域中定义f1
function f1 () { // 外部函数
var count = 100;
addOne = function () {
count += 1;
}
return function f2 () { // 内部函数
console.log(count);
}
}
var refe = f1();
refe(); // 100 (这一步证明了在函数外读取函数内部的变量count)
addOne(); // 调用全局变量addOne使count加1,如果变量count不存在内存中就会报count is not defined(证明了变量的值始终保持在内存中)
refe(); // 在原来的值上加1就证明变量一直存在内存中
闭包的注意事项
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
练习
// 案例1
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return that.name;
};
}
};
// 问输出什么?
console.log(object.getNameFunc()());
// 案例2
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
// 问输出什么?
console.log(object.getNameFunc()());
网友评论