Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在JavaScript中重新声明现有函数的作用域?_Javascript_Node.js_Function_Scope_Closures - Fatal编程技术网

有没有办法在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替换程序