闭包
闭包的定义:
外部函数里面包含内部函数;
闭包的优缺点:
//优点:保证变量不被全局污染 ,外部可以访问函数内部的变量
// 缺点,执行完毕后变量不会释放。容易造成内存泄漏
那么闭包到底是什么样子的呢,我们就来看一下;
function fun() {
var a = 'aaa'
var d = 'eeee'
return function () {
var c = 'ccc'
console.log(a)
console.log(d)
}
}
var d = 'dddd'
// fun()
var res = fun()
res()
// res 存的值。与res1形式一样
// 所以 fun 与 res 是两个相互独立的作用域。
// var res1 = function () {
// var c = 'ccc'
// console.log(c)
// console.log(a)
// }
// (function(){
// var a = 'aaa'
// console.log(cc)
// return function(){
// var cc = 'cc'
// console.log(a)
// }
// }())
// 闭包内变量不会被全局变量污染
function fun() {
a = 0 // 全局变量
var b = '' // 闭包内变量
var fn = function () {
console.log(a)
console.log(b)
}
return fn
}
var res = fun()
var b ='用来污染闭包中变量;没污染成'
var a = 222 // 全局变量
res()
// 因为正常情况下,res() 访问的变量为全局,全局变量是可以被全局变量修改的
// 又因为 闭包中没修稿
// 所以 闭包优点不能被全局变量污染
// 原理因为:作用域 , 函数赋值特点有关
// 函数赋值特点;将一个定义的函数赋值给另一变量xx, xx() 实际上执行的就是定义的函数
// 函数赋值 浅拷贝 牵一发动全身
function a(){
console.log('aaa')
var d = 'sss'
}
// 只要a 变了 bcd 全变
var b = a
var c = b
var d = c
b()
a()
var c = 'qq'
// var c = 1123;
var b = c
b= 23
在上面我们不难可以看到闭包的特点。