javascript - 从闭包中取回数据

标签 javascript functional-programming scope closures metaprogramming

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

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

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

TenFunction = K(10)
TenFunction()
10

在 R 中,可以直接查找绑定(bind)到“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}

如有任何帮助或见解,我们将不胜感激。如果需要任何说明,请在下方发表评论,我将编辑我的问题。

最佳答案

不像你描述的那样,不。函数对象支持很少的反射方法,其中大部分已被弃用或过时。这是有充分理由的:虽然闭包是实现词法作用域函数的常见方式,但它们不是唯一方式,在某些情况下它们可能不是最快的。 Javascript 可能会避免公开此类细节,以允许实现更灵活地提高性能。

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

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

编辑

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

关于javascript - 从闭包中取回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441509/

相关文章:

javascript - form.submit() 方法中的 setTimeout 不起作用

javascript - Angular $http 未在 $routeProvider 中解析

javascript - 有没有办法更新云功能中的collectionGroup

scala - 如何 flatMap cats Applicatives

ColdFusion:从同一组件调用 cffunction

c# - 这个C#函数组合方法是如何工作的?

javascript - 使用 meteor 和 blaze 如何将模板转换为电子邮件正文的字符串?

javascript - document.ready 中的全局 javascript 变量

javascript - AngularJS 变量作用域、JavaScript 变量作用域

JavaScript - 当使用 let 而不是 var 时,练习的解决方案不起作用