作用域链、闭包

函数也是一种对象类型  引用类型 引用值

function test(){}   

// test.name

//test.length

//test.prototype

全局运行时生成全局执行期上下文-->GO

函数创建时生成函数执行期上下文-->AO   

作用于链其实就是保存AO,GO的容器,从上到下形成链条排列起来

函数执行完成,AO会被销毁,函数重新执行会重新生成新的AO-->AO是一个即时的存储容器

function a(){
    function b(){
        var b = 2;
    }
    var a = 1;
    b();
}

var c = 3;
a();

作用域链、闭包_第1张图片

 每个函数在被定义的时候就已经包含了GO

作用域链、闭包_第2张图片

 b函数被定义时,b函数的作用域链与a函数在执行时的作用域链相同

作用域链、闭包_第3张图片

 b函数执行前一刻,生成b函数的AO,并且放在b函数作用域链的第一位作用域链、闭包_第4张图片

作用域链、闭包_第5张图片

a函数结束时,a函数的AO被销毁,同时b函数是存在a函数内的,因此b函数也被整个销毁了

作用域链、闭包_第6张图片

闭包 


function test1(){
    function test2(){
        var b = 2;
        console.log(a)
    }
    var a = 1;
    return test2;
}

var c = 3;
var test3 = test1();
test3();

 作用域链、闭包_第7张图片

 作用域链、闭包_第8张图片

 当内部函数被返回到外部,并且被保存时,一定会产生闭包,闭包会产生原来的作用域链不释放,过渡闭包会导致内存泄漏,或者加载变慢

 例子

function test(){
    var n = 1;
    
    function ad(){
        n++;
        console.log(n);
    }

    function reduce(){
        n--;
        console.log(n);
    }

    return [add,reduce]

}
var arr = test()
arr[0]()
arr[1]()

你可能感兴趣的:(js深度指南,javascript,开发语言,ecmascript)