内存释放:
栈内存的形成和释放:
全局作用域:
- 形成:当浏览器加载完页面的时候,全局作用域形成
- 销毁:关闭页面,关闭浏览器,关闭电脑...
私有作用域:
- 形成:当函数被调用的时候,形成私有作用域;
- 销毁:一般当函数执行完成的时候,私有作用域就释放了,但是特殊情况除外:
- 不释放:如果函数中的东西,被外面的变量或其他(作为对象属性)占用的时候,就无法释放
- 不立即释放:最典型的就是当函数执行完成的时候,返回一个函数的定义阶段,这个定义阶段,还要再被执行一次;当两次都执行完成的时候,私有作用域得到释放;
垃圾回收机制:
浏览器每隔一段事件,都会回收没用的内存,所以,当我们不用那个地址的时候,可以把占用这个地址的东西,指向空指针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(){})(); //按照预解释中自执行函数的规定; 不会进行预解释,执行到的时候,声明+定义+调用 同步完成;