js中的作用域
作用域是变量和函数能起作用的范围,在 ES6之前只有全局作用域和局部作用域
全局作用域:变量和函数在整个script内都能调用
var a = 10;
function fn(){
console.log(a);
}
fn();//10
局部作用域:作用于函数内部,函数外部不能调用
function fn(){
var a = 10;
console.log(a);
}
fn();//10
console.log(a);//a is not defined
特殊情况:如果变量前面没有 var 关键字,这个变量就成了全局属性
function fn(){
a = 10;
console.log(a);
}
fn();//10
console.log(a);//10
补充:作用域链:就近原则,变量从内到外查找的方法,此作用域没有就到上一级作用域查找
var a = 1;
function fn(){
var a = 2;
function inner(){
//var a = 3;
console.log(a);//2
}
inner();
}
fn();
js中的闭包
闭包(closure)指有权访问另一个函数作用域中的变量的函数。–JavaScript高级程序设计
简单理解就是:一个作用域可以访问另一个函数内部的局部变量
function fn(){
var num = 10;
function fun(){
console.log(num);
}
fun();
}
fn();
此时就会产生一个闭包函数
闭包的作用
1.延申了变量的作用范围
这里通过返回一个函数的方法在全局作用域中访问到了函数内部的变量
function fn(){
var num = 10;
return function(){
console.log(num);
}
}
fn()();//10
var f = fn();
f();//10
2.实现封装,管理私有变量和私有方法,将变量的变化封装在安全的环境中
function f1() {
var num = 12;//默认值
function getNum() {
return num;
}
function setNum(value) {
if (value > 0 && value < 100) { //设置条件,保护私有变量
num = value;
}
}
return {
getNum: getNum,
setNum: setNum
}
}
var res = f1();
res.setNum(120);
console.log(res.getNum());//12
3.闭包的缺点:闭包中的变量会始终保持在内存中,直到程序结束,内存消耗会很大