IsYang's Blog


生于忧患,死于安乐。


JS-JavaScript闭包

闭包简介

闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。

变量的作用域

变量的作用域分为:全局变量局部变量

(一)、全局变量和局部变量代码所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以访问color、anotherColor和tempColor
}
//这里可以访问color和anotherColor,但不能访问tempCOlor
swapColors();
}
//这里只能访问color
changeColor();

以上代码共涉及3个执行变量:全局变量、changeColor()的局部环境和swapColors()的局部环境。
全局环境中有一个变量color和一个函数changeColor()。
changeColor()的局部环境中有一个变量anotherColor和一个函数swapColors();并可以访问全局环境中的变量color。
swapColors()的局部环境中有一个变量tempColor;该变量只能在这个swapColors()的局部环境中访问,然而可以访问其他两个环境中(父执行环境)的所有变量。

内部环境可以通过作用域访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。


(二)、声明变量

1
2
3
4
5
6
function add(num1, num2){
sum = num1 + num2;
return sum;
}
var result = add(10,20);
alert(sum); //30

如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。


(三)、查询标识符

1
2
3
4
5
6
var color ="blue";
function getColor(){
var color = "red";
return color;
}
alert(getColor()); //"red"

如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符。也就是说任何位于局部变量color的声明之后的代码,如果不使用window.color都无法访问全局color变量。


以下是来自阮一峰总结

闭包的概念

1. 闭包就是能够读取其他函数内部变量的函数。
2. 定义在一个函数内部的函数。


闭包的用途

  1. 可以读取函数内部的变量
  2. 可以让这些变量的值始终保持在内存中。

使用闭包的注意点

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在Ie中可能导致内存泄露解决方法是,在退出函数之前,将不使用的局部变量全部删除
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当做对象(object)使用,把闭包当作它的公用方法(public method),把内部变量当作它的私有属性(pricate value),这时不要随便改变父函数内部变量的值。