什么是闭包?
当内部的函数被保存在了外部时,由于内部函数的作用域链上存在着内部函数创建时的作用域环境(父函数和祖先函数的AO对象,以及全局的GO对象),导致内部函数可以顺着作用域链寻找所以形成了闭包,同时内部函数的作用域链无法被垃圾回收机制回收,导致内存泄露。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
//go{
// cc:888,
//dd:function aa(),
//aa:function aa(),
//}
// scope aa go
function aa(){
// ao{
// a:10
// bb:function
// }
// scope bb aa go
function bb(){
// ao{
// bb:666
// }
var bb=666;
console.log(a) // undefined undefined
}
bb();
var a=10;
return bb;
}
var cc=888;
var dd=aa(); //右边是个表达式先执行完表达式在赋值给bb
dd();
//每一个函数都会记住 自己定义时的作用域环境(父级作用域一直到全局作用域)
//函数执行是,函数内部创建自己的作用域,添加到自己出生时作用域环境的顶部
// 正常来说一个函数执行完毕以后,自己的作用域会被垃圾回收机制销毁
//如果定义时的作用域环境被销毁,那么函数记住的所有作用域都会被销毁
//但是如果这个函数被挪到别的作用域中去定义了,那么函数将一直记住自己出生时的作用域环境。