JS里作用域是由函数划分的,而不是由块(while、if和for)划分。函数可以直接读取全局变量,但是外部无法直接访问函数内部的变量。
闭包的意思是内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。闭包之于JS是非常重要的概念。
假设说有这么一个例子:
假设我们真的需要完成这样一个功能,n这个全局变量的声明是不合适的,这是一个坏习惯,谁也不知道你在函数内部还声明了一个名为n的全局变量。所以我们需要把n藏起来
这个方法通过创建一个f2这个函数把n变量读取到外部,并执行和第一段代码相同的功能。这个就是闭包最基础的用法,外部调用函数内部的变量。闭包还能使这个变量值始终保持在内存里,看下面这个应用:
闭包的意思是内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。闭包之于JS是非常重要的概念。
假设说有这么一个例子:
function f1(){
n=999;//声明了一个全局变量
}
f1();
alert(n); // 999,外部使用到这个变量
假设我们真的需要完成这样一个功能,n这个全局变量的声明是不合适的,这是一个坏习惯,谁也不知道你在函数内部还声明了一个名为n的全局变量。所以我们需要把n藏起来
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); //这个就是执行函数f2
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
为什么n的值始终保持在内存里呢?f1函数的执行结果f2在外部被赋予给一个全局变量,所以f2里面的内容不会被回收,n变量值一直被保存着。而nAdd呢是被定义的一个全局变量而且是个匿名函数,也相当于一个闭包可以对n进行操作。所以第二个result的执行结果是1000.