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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值