JS-NO.8

内存释放:

栈内存的形成和释放:

全局作用域:

  • 形成:当浏览器加载完页面的时候,全局作用域形成
  • 销毁:关闭页面,关闭浏览器,关闭电脑...

私有作用域:

  • 形成:当函数被调用的时候,形成私有作用域;
  • 销毁:一般当函数执行完成的时候,私有作用域就释放了,但是特殊情况除外:
    • 不释放:如果函数中的东西,被外面的变量或其他(作为对象属性)占用的时候,就无法释放
    • 不立即释放:最典型的就是当函数执行完成的时候,返回一个函数的定义阶段,这个定义阶段,还要再被执行一次;当两次都执行完成的时候,私有作用域得到释放;

垃圾回收机制:

浏览器每隔一段事件,都会回收没用的内存,所以,当我们不用那个地址的时候,可以把占用这个地址的东西,指向空指针null;这样,等浏览器空闲的时候,就会把这个内存进行回收;

带var和不带var的区别:

  • 带var的:1) 私有变量 2)会进行预解释
  • 不带var: 1) 如果是设置,找不到,window.a=xxx; 如果是获取,找不到,报错 xxx is not defined; 2)不会进行预解释;

上级作用域:

  • 上级作用域跟函数在哪里调用无关,只跟函数对应的堆内存,在哪个空间下开辟有关;

预解释无节操:

1)只对等号左边带var的声明,但不定义
2)条件判断语句,无论是否成立,都会进行预解释

  • 提示我们:永远不要在条件判断语句中,写函数的定义阶段;浏览器有兼容问题;

3)自执行函数不会进行预解释,只有执行到他的时候:声明+定义+调用 同步完成
4)已经声明过的,不会进行重复声明
5)return后面语句不会进行预解释,return下面的语句虽然不执行,但会进行预解释

函数的几种写法,写法不同,导致预解释就不同

1、 函数常规写法

function fn(){....}    //按照function进行预解释; 声明+定义  var fn=xxxx;

2、把函数赋值给变量;
var fn=function(){} //表达式的写法;按照变量的规则,进行预解释; var fn; 只声明,不定义
3、把函数作为值赋值给 对象.属性名;

oDiv.onClick=function(){};  //类似于 window.f=function(){} 不会进行预解释

4、自执行函数

(function(){})();   //按照预解释中自执行函数的规定; 不会进行预解释,执行到的时候,声明+定义+调用 同步完成;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 4,712评论 0 3
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,401评论 30 472
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 11,006评论 0 106
  • 大年初六,清晨阳光明媚,嫩寒里丝丝微风,春天的脚步悄无声息地走来,遥远的若有若无,但已经能感觉到了她的到来,河边柳...
    无无行阅读 1,486评论 0 6
  • [待做] router完善 尝试写数据库,新版本安装进行增加。应用启动加载scheme,其它方式唤起的,需要查数据...
    Hawking_zheng阅读 1,693评论 0 0

友情链接更多精彩内容