一、 变量的作用域
一个变量的作用域(scope)是程序源代码中定义这个变量的区域。按变量作用域可以将变量分为全局变量和局部变量。
全局变量:在JavaScript代码中任何地方都是有定义的。
局部变量:在函数体内部有定义,作用域是局限性的。
var a = 0; // 全局变量a
function foo1() {
console.log('a = ', a); // 结果为 a = 0
}
console.log('a = ', a); // 结果为 a = 0
// --------------
function foo2() {
var b = 10; // 局部变量b
console.log('a = ', a); // 结果为 a = 0
console.log('b = ', b); // 结果为 b = 10
}
// console.log('b = ', b) // 打开注释后报错结果为 Uncaught ReferenceError: b is not defined
foo1();
foo2();
二、 闭包
理解上面的变量作用域,下面我们看看,怎么在函数的外面获得函数内部变量。
function foo1() {
var a = 20;
// 闭包函数foo2
function foo2() {
console.log('a = ', a);
return a;
}
return foo2;
}
var b = foo1()(); // a = 20
console.log(b); // 20
foo1包含着一个函数foo2,foo2就是一个闭包。在我看来,闭包就是一个函数,这个函数在另一个函数体内部,并且向父函数的外部,返回父函数内部的变量。闭包函数是父函数内部变量与外界的桥梁。
三、闭包的用途
- 可以用来读取函数内部的变量。
- 可以将变量保存在内存中,不被垃圾回收机制回收。
四、闭包的优缺点
优点:可以在函数外部操作函数内部变量。
缺点:由于闭包会让函数体内变量常驻内存,滥用闭包会导致内存泄露,影响性能。
原文作者:最帅的坏兔子
技术博客:https://www.jianshu.com/u/259b7db6cc20
90后,爱编程,爱运营,文艺与代码齐飞,魅力与智慧共存的全栈开发一枚。
坚持总结工作中遇到的技术问题,坚持记录工作中所思所见,可以加小编微信一起交流学习:hxa2wangting13815。
网友评论