【问题标题】:Is there a way to redeclare the scopes of an existing function in JavaScript?有没有办法在 JavaScript 中重新声明现有函数的范围?
【发布时间】:2020-05-15 16:27:21
【问题描述】:

我遇到了这个问题,我希望一个函数可以从外部访问,但它还需要继承一些基于范围的属性,因为它在 JSON.stringify() 中用作可选的字符串化符,因此不能将额外的上下文传递给它。

假设我有这个代码

let object = {
  function1(){ 
    let a = 1
    console.log(object.function2()) // a is not defined undefined
  },
  function2(){ return a }
}

所以我想知道是否有办法改变 function2 的闭包/作用域状态,比如绑定一个新的 this 上下文但绑定整个作用域。

我发现的唯一方法是

let object = {
  function1(){ 
    let a = 1
    let function2 = eval('(function '+object.function2.toString()+')')
    console.log(function2()) // 1
  },
  function2(){ return a }
}

原因是内存管理,因为我不想在每次调用另一个函数时都创建一个新函数。

【问题讨论】:

  • 这样做也会破坏 VSCode 中的调试功能,因为它是一段经过评估的代码
  • 为什么不将a 设为object 的属性?那么function2可以返回this.a
  • 或阅读本文的“模拟私人成员”部分:let
  • 您能否提供一个示例,说明该功能应如何“从外部访问”。也许是一个具有预期结果的更具体的例子?还有其他方法可以传递数据和绑定函数,但我不确定要求是什么。
  • this.a 可能是 .bind(object) 用于 JSON.stringify 替换器

标签: javascript node.js function scope closures


【解决方案1】:

我想知道是否有办法更改函数的闭包/作用域状态,例如绑定新的 this 上下文但绑定整个作用域。

不,这是不可能的。作用域是词法的,函数的作用域链在函数创建时是固定的。它必须是不可变的,以允许引擎优化标识符解析。

您最好的选择可能是设置已经在函数范围内的变量的值。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2021-12-27
    • 2020-07-15
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2018-07-12
    • 2018-10-17
    相关资源
    最近更新 更多