最近在研究 JavaScript 中闭包,发现 A 函数返回值是其内部定义的 B 函数对象时,就算 A 函数执行完,因为词法环境的缘故,A 函数内部的局部变量也不会被销毁。
类似的 python 中闭包也有这个特性
而这个和我理解 C 语言或汇编的调用栈,一个函数执行完,调用栈中所有的变量都会被销毁,完全不一样
直到我看到别人博客中一句话:
“ 汇编或 C 语言中的栈和高级语言中栈是完全不同的。JavaScript 中闭包是在堆中申请的,使用 gc 管理,而汇编栈不存在 gc ,由函数调用与返回来自动更新 SP 指针实现的。所以在高级语言的闭包中其父级作用域在函数结束后不会被销毁 ”
他这句话对吗?高级语言的函数调用栈是都在堆中申请的吗?
function User(age){
this.age = age
this.changeAge = function(){
this.age += 1
console.log(this.age)
}
}
let tom = new User(18)
tom.changeAge() // 19
tom.changeAge() // 20 ,而不是 19
所以 js 的构造函数可以反复使用方法修改属性就是借助闭包实现的是吗?
class User:
def __init__(self, age):
self.age = age
def changeAge(self):
self.age += 1
print(self.age)
tom = User(18)
tom.changeAge() // 19
tom.changeAge() // 20 ,而不是 19
类似 python 的类的实现细节中,对象的方法可以反复修改对象的属性也是借助闭包实现是吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.