从闭包中获取数据

Getting data back out of closures

本文关键字:数据 获取 闭包      更新时间:2023-09-26

是否有一种方法来提取由函数关闭的变量?

在(类似javascript的)R语言中值是可以通过查找函数的作用域来访问Closed-over直接。例如,常量组合子接受一个值并返回一个总是产生所述值的函数。

K = function (self) {
    function () {
        self
    }
}
TenFunction = K(10)
TenFunction()
10

在R中,绑定到"self"的值可以直接查找。

environment(TenFunction)[[ "self" ]]
10

在R中,这是一个完全正常和可以接受的事情。是JavaScript中有类似的机制吗?

我的动机是我正在使用的函数,我使用一个名为"self"的封闭值创建。我希望能够将数据从函数中提取出来。一个松散的模拟示例与我的问题相关的是。

var Velocity = function (self) {
    return function (time) {
        return self.vx0 + self.ax * time
    }
}
var f = Velocity({vx0: 10, ax: 100})

我真的很想提取self的值。Vx0和self。尽管他们是斧头难以通过其他方式恢复。是否存在一个函数"someFun"来完成此操作?

someFun(f).self
{vx0: 10, ax: 100}

任何帮助或见解将不胜感激。如果有任何需要澄清的地方,请在下面留言,我会编辑我的问题。

不是你说的那样。函数对象支持的反射方法非常少,其中大多数都已弃用或过时。这样做有一个很好的理由:虽然闭包是一种常见的实现词法作用域函数的方式,但它们并不是唯一的方式,而且在某些情况下,它们可能不是最快的。Javascript可能会避免暴露这些细节,以允许实现更灵活地提高性能。

也就是说,你可以用不同的方法来解决这个问题。一种方法是向内部函数添加一个参数,告诉它应该返回某个变量的值,而不是像通常那样做。或者,您可以将变量存储在函数旁边。

关于另一种实现技术的例子,请查阅"lambda提升"。有些实现可能在不同的情况下使用不同的方法。

编辑

不允许这种反射的一个更好的理由是,它相当严重地破坏了函数的抽象,并且这样做暴露了函数如何产生的可怕细节。如果你想要那种访问,你需要的是对象,而不是函数。