闭包

/*闭包
要理解闭包,首先必须理解js特殊的变量作用域。变量的作用域无非就是两种,全局与局部变量
且函数内部可以直接读取到全局变量
* */

var n=999;
function f1() {
alert(n);
}
f1();//99
//在函数外部自然无法读取函数内的局部变量
function f2(){
var a=8; //函数内部声明变量的时候,一定要使用var命令,否则实际上声明了一个全局变量
}
// alert(a)//defined

//如何从外部读取局部变量,由于各种原因,我们有时候需要得到函数内部的局部变量,但是前面已经说过,正常情况下是取不到的,只有通过变通方法才能实现 那就是在函数的内部,在定义一个函数

function fn(){
var n=999;
function fn2(){
alert(n);//99
}
}
//在上面代码中,函数fn2就被包括在函数fn内部,这时fn内部的所有局部变量对fn2都是可见的,但是返过来就不行,fn2内部的局部变量,对fn就是不可见的,这就是js语言特有的链式作用域结构,子对象会一级一级的向上寻找所有父对象的变量,所以,父对象的所有变量,对子对象都是可见的,反之则不成立 既然fn2可以读取fn的局部变量,那么只要把fn2作为返回值,我们不就可以在f1外部读取它的内部变量了吗


function fn3(){
var n=666;
function fn4(){
alert(n);
}
return fn4;
}
var result = fn3();
result();//666

//闭包概念 上边代码中的fn4函数就是闭包 ,闭包就是能够读取其他函数内部变量的函数 , 在js语言中,只有函数内部才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数” 本质上说闭包其实就是将函数内部和函数外部连接起来的一座桥梁

//闭包的用途 闭包可以用在很多地方,他的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
function fnn(){
var n=999;
nAdd=function(){
n+=1;
}
function fnn2(){
alert(n);
}
return fnn2;
}

var result=fnn();
result();//999

nAdd();
result();//1000

原文地址:https://www.cnblogs.com/h5it/p/9274435.html