Javascript基础——闭包为什么会存在
闭包(closure)为什么会存在
在ES6以前,Javascript只有全局作用域和函数作用域的概念,与之相对应的全局变量和局部变量。如果有一个变量在函数作用域被声明了,那么函数外如何访问这个变量。那就是在函数f1的内部在定义一个函数f2,此时函数f1的局部变量就对函数f2是可见的。只要把函数f2作为返回值那么我们就可以在函数f1外部读取它的内部变量。
//闭包
function f1 (){
var a = 10;
return function f2(){
console.log(a);
};
}
f1()();//10
什么是闭包?
当函数可以记住并访问所在的词法作用域,即使函数在当前词法作用域外执行,这就产生了闭包。
换句话说闭包就是函数中的函数,里面的函数可以访问外部函数的变量,外面的变量是这个内部函数的一部分。那么我们可以总结出闭包形成的条件:1.函数嵌套 2. 内部函数引用外部函数的局部变量
闭包的应用
可以读取函数内部的变量
可以使变量的值长期保存在内存中
可以用来实现JS模块
闭包的危害
一般情况下,函数执行会形成一个新的私有的作用域,当私有作用域中的代码执行完成后,我们当前作用域都会主动进行释放和消毁,但遇到函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西给接收了。这种情况下一般形成的私有作用域都不会销毁。这时候就发生了内存泄漏,什么叫内存泄漏,任何对象在您不在拥有或需要它之后仍然存在。
function outer(){
var num = 0 ;
return function inner(){
num++;
console.log(num);
}
}
var f1 = outer();
f1(); // 1 inner函数的作用域一直被占用
f1(); // 2 inner函数的作用域一直被占用
f1(); // 3 inner函数作用域一直被占用

浙公网安备 33010602011771号