作用域链:
当函数被调用的时候,会形成一个私有作用域,看私有作用域中,是否存在私有变量A:
1)如果有私有变量A:那么整个作用域中的A,跟外界没有任何关系;所有该作用域中的A,都是私有变量;
2)如果没有私有变量A:就会往上级作用域进行查找,找到的话,直接用,找不到继续找,一直找到window还没有,就会报错!;
私有变量有两种:
①当前作用域下带var的;
②形参;
堆内存的释放
对象数据类型或者函数数据类型在[定义]的时候首先都会开辟一个堆内存,堆内存又有一个引用的地址,如果外面有变量等知道了这个地址,我们就说这个内存被占用了,就不能销毁了。
"var obj1 = {};
var obj2 = obj1;"
我们想要让堆内存释放/销毁,只需要把所有引用它的变量值赋值为null就可以,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁...(也叫垃圾回收)
"obj1 = null;
obj2 = null;"
栈内存
全局作用域 全局作用域不销毁,只有当页面关闭的时候全局作用域才会销毁。
私有作用域
(只有函数执行会产生私有作用域)
1、当代码执行完成后,我们当前作用域都会主动的进行释放和销毁。
2、但是,还是存在特殊情况的:
a、当私有作用域中的部分内存被作用域以外的东西占用了,那么当前的这个作用域就不能销毁了。
例子:1)函数执行返回了一个引用数据类型的值,并且在函数外面被一个其他的东西给接收了,这种情况下一般形成的私有作用域都不会被销毁。
"function fn() {
var num=100;
return function fn(){
num++;
}
}
fn();" 这个函数是销毁。
function fn(){
var num=1000;
return function(){
}
}
var f=fn(); //fn执行形成的这个私有作用域就不在销毁了。
"function fn() {
var num=100;
return 10;
}
var f=fn();" //私有作用域就可以销毁了
function fn() {
var num=100;
return function (){
alert(1);
};
}
fn()();
/这种情况属于不立即销毁-->fn返回的函数没有被其他的东西占用,但是还需要执行一次在被销毁。
2、在一个私有作用域中给DOM元素的事件绑定方法,一般情况下我们的私有作用域,都不销毁。
var oDiv = document.getElementById("div1");
!function (){
oDiv.onclick =function(){
}
}();//当前自执行函数形成的这个私有作用域也是不可以销毁
总结
函数能被销毁的情况:
1函数最后的值是一个值,不再调用此函数了,就可以被销毁。
不能被销毁的情况:
1函数里有全局变量。
2函数有事件发生,不能被销毁,
3函数最后的值还是函数,不能被销毁。