作用域
- 在函数内部是可以读取到全局变量的
var n1 = 12;
function f1 () {
alert(n1);
}
f1(); // 12
- 在函数外部访问不到函数内部声明的局部变量
function f2() {
var n2 = 12;
}
alert(n2);
- 闭包
这里的f4 就是闭包
function f3 () {
var n3 = 12;
function f4() {
alert(n3);
};
return f4;
// f4();
}
var res = f3();
console.log(res);
res();
闭包
闭包的定义 :
就是在函数内部声明一个函数, 这个函数可以访问函数内部声明的局部变量 那么这个函数就叫做闭包
理解 : 之后函数内部的子函数才可以访问函数内部声明的局部变量
全局变量:可以反复使用,随处可用(容易造成全局污染)
全局变量的生命周期:从变量声明开始到程序运行结束
局部变量:不可以重复使用,只在函数中使用
局部变量的生命周期 : 从变量声明开始到声明这个局部变量的函数执行完回收
function f1() {
var ranNum = Math.floor(Math.random() * 100);
function f2() {
console.log(ranNum);
}
return f2;
}
var fun = f1();
fun();
fun();
f1()();
f1()();
function fun() {
var num = 13;
}
console.log(num);
闭包的优点
可以使用重复变量有保护变量不被污染的一种机制。
需求 : 在函数外部访问函数内部的局部变量, 怎么访问?
//1.用外层函数包裹受保护的变量和操作变量的内层函数
function outer(){
var i=1
//活动对象,函数作用域
//2.外层函数将内层函数返回
return function getNum(){
console.log(i++);
}
}
//3.使用者调用外层函数,获得内层函数的对象
var getNum=outer();
getNum();//1
getNum();//2
getNum();//3
getNum();//4
闭包的作用
1.提升局部变量的生命周期
全局变量的生命周期:从变量声明开始到程序运行结束
局部变量的生命周期 : 从变量声明开始到声明这个局部变量的函数执行完回收
function f1(){
var num=12;
function f2(){
console.log(num);
}
return f2;
}
var res=f1();
res();
2.提供有限的访问权限