请教一个高级语言中函数调用栈相关的问题

2022-08-30 16:50:34 +08:00
 yezheyu

最近在研究 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 的类的实现细节中,对象的方法可以反复修改对象的属性也是借助闭包实现是吗?

1830 次点击
所在节点    程序员
22 条回复
yezheyu
2022-08-31 15:41:39 +08:00
@hangbale 多谢老哥,明白了
Orlion
2022-08-31 19:05:38 +08:00
闭包其实挺好理解的,比如你有一个函数,会返回一个回调函数,这个回调函数中会持有一些自己的局部变量
function bar() {
return function() {
int tmp = 1;
print(tmp);
}
}
callback = bar();
callback();

你当然也可以不返回回调函数,而是返回一个 class,就像下面这样:
class C {
private int tmp;

public C(int tmp) {
this.tmp = tmp;
}

public callback() {
print(tmp);
}
}

function foo() C {
c = new C(1);
return C;
}
foo().callback();

达成的效果其实是一样的,返回的闭包函数其实就等价于一个带有私有属性和一个 method 的 class 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX