将数据从闭包中取出

时间:2014-03-16 19:10:05

标签: javascript functional-programming scope closures metaprogramming

有没有办法提取一个被函数关闭的变量?

在(类似JavaScript)R语言中 通过查找功能的范围可以访问关闭状态 直。例如,常量组合器获取值并返回 一个始终产生所述值的函数。

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.ax的值 难以通过其他方式恢复。有没有功能" someFun"这样做了吗?

someFun(f).self

{vx0: 10, ax: 100}

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

1 个答案:

答案 0 :(得分:2)

不像你所描述的那样,没有。函数对象支持很少的反射方法,其中大多数已被弃用或过时。这有一个很好的理由:虽然闭包是实现词法范围函数的常用方式,但它们不是唯一的方式,在某些情况下它们可能不是最快的。 Javascript可能避免暴露这些细节,以允许实现更灵活地提高性能。

那就是说,你可以通过各种方式解决这个问题。一种方法是向内部函数添加一个参数,告诉它应该返回某个变量的值而不是通常做的事情。或者,您可以将变量与函数一起存储。

有关替代实现技术的示例,请查找“lambda lifting”。某些实现可能在不同情况下使用不同的方法。

修改

不允许这种反射的一个更好的理由是它破坏了函数抽象而非常可怕,并且这样做暴露了函数生成方式的毛茸茸细节。如果你想要那种访问,你真的想要一个对象,而不是一个函数。