JavaScript-闭包函数(理解)

JavaScript-闭包函数(理解)

var foo = function (a) {
    return function inner  ()  {
        console.log(a)
    }
}


var faa = foo(1)

/*
fooContext = {
    variableObejct:{
        inner:[对函数声明inner的引用]
	    arg:1
    }
    this: thisValue,
    Scope:[
    	 globalContext.variableObject   // 就是全局变量
    ]
}

innerContext = {
    variableObejct:{
    }
    this: thisValue,
    Scope:[
    	 fooContext.variableObject      // foo的变量
    	 globalContext.variableObject   // 就是全局变量
    ]
}

这是你原文的一段话:
实际上,foo函数调用结束后, foo函数的变量对象并不会被立即销毁,而是只有当取得foo函数闭包的值的foo1, foo2, foo3调用结束, 这三个函数的变量对象和作用域链被销毁后, foo函数才算“完成任务”,这时,它才能被销毁。

我是不是可以这样理解:
innerContext中的Scope里还有对 fooContext.variableObject 的引用吧,所以此时foo是不会删除的,只有当inner这个闭包函数被调用完之后,inner这个作用域被删除之后,fooContext.variableObject没有其他被引用了,这时也就会删除掉foo的作用域

*/

关于闭包先了解函数执行环境,作用域链以及变量对象

在函数调用的时候,会创建一个函数的执行环境,这个执行环境有一个与之对象的变量对象和作用域链

ExecutionContext = {
    variableObject: { .... },
    this: thisValue,
    Scope: [ // Scope chain
      // 所有变量对象的列表     ]
};

变量对象和作用域链

var foo = function (a) {
    var name = "zhuyu"
    var inner = function () {
        console.log(a)
    }
    return inner
}

foo(222)

// 上面这个函数调用的时候,它的执行环境的变量对象就是variableObject里的数据
// 它的作用域链就是Scope里的数据
fooexectionContext = {
    variableObject:{
        name:"zhuyu",
        inner:[函数inner的引用],
        arg:222
    }
    Scope:[
        fooexectionContext.variableObject,
        gobleExectionContext.variableObjet,
    ]
}

上面这个例子只是返回了一个闭包函数,就调用了一次函数

原文地址:https://www.cnblogs.com/zhuchunyu/p/10777711.html