如何查找上级作用域
当前函数是在哪个作用域下定义的,那么它的上级作用域就是谁
var num = 12;
function f() {
var num = 120;
return function () {
console.log(num)
}
}
var fn = f();
fn();//120
(function () {
var num = 1200;
fn();//120
})()
堆内存
对象数据类型或者函数数据类型在定义的时候首先会开辟一个堆内存,堆内存有一个引用的地址,如果外面有变量知道了这个地址,我们就说这个内存被占用了,就不能销毁了;想要销毁堆内存,只需要把所有引用它的变量赋值为null,当这个堆内存没有任何变量指向它,它就会被销毁
栈内存(作用域)
全局作用域:只有浏览器关闭页面的时候,全局作用域才会释放
私有作用域:
只有函数执行才会产生私有作用域,一般情况下,函数执行会形成一个私有作用域,当私有作用域中代码执行后,我们当前作用域会主动的释放和销毁
但是还是有特殊情况:
当前私有作用域中的部分内容被作用域以外的东西占用了,那么当前这个作用域就不能销毁,主要有以下几种情况:
- 函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其它的东西接收了,这种情况形成的私有作用域不销毁
function fn(){
var i=10;
return function(n){
console.log(n+(++i))
}
}
var f = fn();
f(10);//21
f(20);//32
fn()(10);//21
fn()(20);//31
- 在一个私有作用域中给DOM元素的事件绑定一个方法,一般情况这个私有作用域不销毁
var oDiv = document.getElementById('odiv');
~function(){
oDiv.onclick=function(){}
}//自执行函数的私有作用域不销毁
- fn返回的函数没有被其它东西占用,但是还需要执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时候把它销毁
funnction fn(){
return function(){}
}
fn()();//执行fn,返回一个小函数对内的内存地址,然后紧接着执行这个小函数,之后才会销毁fn对应的内存