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(){})();   //按照预解释中自执行函数的规定; 不会进行预解释,执行到的时候,声明+定义+调用 同步完成;

你可能感兴趣的:(JS-NO.8)