函数和对其周围状态的引用捆绑在一起构成闭包
closure
。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
通俗理解
- 函数中的函数就叫闭包。
- 一个函数可以访问另外一个函数的内部变量,这个函数就叫闭包。
- 闭包是一个定义在父函数里面的函数。
闭包拥有如下三个作用域的访问权:
- 自身的作用域
- 父作用域
- 全局作用域
示例
var globalVar = "abc";
(function outerFunction (outerArg) {
var outerFuncVar = 'x';
(function innerFunction (innerArg) {
var innerFuncVar = "y";
console.log(
"outerArg = " + outerArg + "\n" + // 7
"outerFuncVar = " + outerFuncVar + "\n" + // x
"innerArg = " + innerArg + "\n" + // 5
"innerFuncVar = " + innerFuncVar + "\n" + // y
"globalVar = " + globalVar); // abc
})(5);
})(7);
实际应用
- 输出 0 - 9
for(var i = 0; i < 10; i++) {
(function (i) {
setTimeout(() => {
console.log(i)
}, 0);
})(i);
};
需要注意的地方
- 由于闭包会使得函数中的变量都会被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。
- 闭包会在父函数外部改变父函数内部变量的值。所以如果你把父函数当作对象使用,把闭包当作的它的公用方法,把内部变量当作他的私有属性,这时一定要小心不要随便改变父函数内部变量的值。
网友评论