有没有办法在JavaScript中重新声明现有函数的作用域?
我遇到了这个问题,我希望函数可以从外部访问,但它还需要继承一些基于范围的属性,因为它在有没有办法在JavaScript中重新声明现有函数的作用域?,javascript,node.js,function,scope,closures,Javascript,Node.js,Function,Scope,Closures,我遇到了这个问题,我希望函数可以从外部访问,但它还需要继承一些基于范围的属性,因为它在JSON.stringify()中用作可选的字符串生成器,因此无法向其传递其他上下文 假设我有这个代码 let对象={ 函数1(){ 设a=1 console.log(object.function2())//未定义 }, function2(){返回a} } 所以我想知道是否有一种方法可以改变function2的闭包/作用域状态,比如绑定一个新的上下文,但绑定整个作用域 我唯一能弄明白的是 let对象={
JSON.stringify()
中用作可选的字符串生成器,因此无法向其传递其他上下文
假设我有这个代码
let对象={
函数1(){
设a=1
console.log(object.function2())//未定义
},
function2(){返回a}
}
所以我想知道是否有一种方法可以改变function2的闭包/作用域状态,比如绑定一个新的上下文,但绑定整个作用域
我唯一能弄明白的是
let对象={
函数1(){
设a=1
让function2=eval('(函数'+object.function2.toString()+'))
console.log(function2())//1
},
function2(){返回a}
}
这样做的原因是内存管理,因为我不想每次调用另一个函数时都创建一个新函数
我想知道是否有一种方法可以改变函数的闭包/作用域状态,比如绑定一个新的上下文,但绑定整个作用域
不,这是不可能的。作用域是词法的,函数的作用域链在函数创建时是固定的。它必须是不可变的,以允许引擎优化标识符分辨率
您最好的选择可能是设置已在函数范围内的变量的值。这样做也会破坏VSCode中的调试功能,因为它是代码的一个评估位。为什么不将
a
作为对象的一个属性呢?然后function2
可以返回this.a
?或者阅读本节的“模拟私人成员”部分:您可以提供一个函数如何“从外部访问”的示例吗。也许是一个更具体的例子,有预期的结果?还有其他方法可以传递数据和绑定函数,但我不确定要求是什么。this.a
可能还有JSON.stringify替换程序