java闭包函数调用_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,

]

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值