Javascript 从闭包中获取数据

Javascript 从闭包中获取数据,javascript,functional-programming,scope,closures,metaprogramming,Javascript,Functional Programming,Scope,Closures,Metaprogramming,有没有办法提取一个被函数关闭的变量 在(类似JavaScript的)R语言中 可以通过查找函数的作用域来访问closed over 直接的。例如,常量组合符接受一个值并返回 总是产生所述值的函数 K = function (self) { function () { self } } TenFunction = K(10) TenFunction() 10 在R中,可以直接查找绑定到“self”的值 environment(TenFunction)[[ "se

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

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

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

TenFunction = K(10)
TenFunction()
10
在R中,可以直接查找绑定到“self”的值

environment(TenFunction)[[ "self" ]]
10
在R中,这是一件非常正常和可以接受的事情。是 JavaScript中有类似的机制吗

我的动机是,我正在使用我所需要的函数 创建一个称为“自我”的封闭值。我希望能够 从函数中提取该数据。一个模拟的例子 与我的问题相关的是

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}

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

与您描述的不同,没有。函数对象支持很少的反射方法,其中大多数是不推荐的或过时的。这有一个很好的理由:虽然闭包是实现词汇范围函数的常用方法,但它们不是唯一的方法,在某些情况下它们可能不是最快的。Javascript可能会避免公开这些细节,以允许实现更灵活地提高性能

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

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

编辑
不允许这种反射的一个更好的理由是,它相当可怕地破坏了函数抽象,并且在这样做的过程中暴露了函数是如何产生的毛茸茸的细节。如果你想要这种访问,你真的想要一个对象,而不是一个函数。

谢谢你的回答-我真的不确定反射不受支持的程度。有鉴于此,向每个内部函数添加一个“reflect”参数(如您所建议的)应该可以很好地工作。