javascript的预解释-作用域-内存的释放

作用域链:
当函数被调用的时候,会形成一个私有作用域,看私有作用域中,是否存在私有变量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函数最后的值还是函数,不能被销毁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...
    梁同学de自言自语阅读 5,326评论 0 6
  • 介绍 JavaScript中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是...
    安_6dd1阅读 4,554评论 0 8
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,378评论 2 17
  • 修心,静心,用心,知心,开心。常怀五心 万物存在皆有理,唯有自心择而行。 无可奈何人老去,似曾相识不复来。 静坐忘...
    旋转的叶轮阅读 1,475评论 0 0
  • jQuery动画具有按序列执行的特点,即第一个动画执行完会继续执行后续动画,好多时候,我们都需要停止当前动画,或立...
    sky丶星如雨阅读 4,028评论 0 0