作用域
全局作用域:在全局作用域里面的变量称为全局变量
函数作用域:保存在函数作用域内的通过var的变量称为局部变量
局部变量:1、在函数内的变量。2、函数的形参变量
js中没有块级作用域,只有全局作用域和函数作用域,es6里面所谓的块级作用域,底层是匿名函数自调形成的作用域,本质还是函数作用域
作用域链
一个函数既可以用自己作用域的变量,又可以用外层作用域的变量,一个函数可以使用的所有作用域连接起来,就形成了当前函数的作用域链,当执行语句时,js会沿着函数作用域链查找要用的变量
作用域链在定义函数时,就已经有了,而不是在调用时才有的
闭包
一个变量需要重复使用,又不会被外部污染的局部变量
闭包是一个对象,闭包就是每次调用外层函数时,临时创建的函数作用域对象被内层函数作用域链引用着,无法释放,形成了闭包
使用闭包步骤:
- 用外层函数包裹要保护的变量和使用变量的内层函数
例:
//第一步
function out(){
var a = 0
}
- 在外层函数内部返回内层函数对象
例:
//第一步
function out(){
var a = 0
//第二步
return function(){
a+=10
console.log('a的值为',a)
}
}
- 调用外层函数,用变量接收返回的内层函数
例:
//第一步
function out(){
var a = 0
//第二步
return function(b){
a+=b
console.log('a的值为',a)
}
}
//第三步
var b = out()
b(10)
b(20)
闭包的缺点:极容易造成内存泄漏