作用域链
- 万物皆对象,函数也是一个对象
- function test(){}
- test.name test.prototype
- 函数中隐式的属性 test.[[scope]]
- [[scope]]:执行期上下文对象的集合
- 执行期上下文对象:当函数执行时,创建一个执行期上下文,定义了函数执行时的环境,函数每次执行时,执行期上下文都是独一无二的,所以每调用一次函数都会创建一个独立的执行期上下文,当函数执行完毕时,它所产生的执行期上下文会被销毁。
function a(){
function b(){
var bb = 234
}
var a = 123;
b();
}
var glob = 100;
a();
/* GO:{
glob:100,
a:function
} */
// a函数在定义时
// a.[[scope]] 0:GO存入到[[scope]]中 入栈
// a函数在调用时 创建一个AO对象
/* AO{
a:123
b:function
}
a.[[scope]] 0:AO
1:GO存入到[[scope]]中 */
// b函数定义时
/* b.[[scope]] 0:aAO
1:GO存入到[[scope]]中 */
// b函数执行的时候
/* AO{
bb:234
}
b.[[scope]] 0:bAO
1:aAO
2:GO存入到[[scope]]中 */
// var a = 123;
// function test(){
// // var a = 234;
// console.log(a);//234
// }
闭包
当内部函数被保存到外部时,将会形成闭包。闭包会导致原有的作用域链不会被释放,造成内存泄漏。
var add;
function test(){
var a = 999;
add = function(){
a++;
};
return function(){
console.log(a);
}
}
var getN = test();
getN();
add();
getN();