Javascript 您可以使用变量,但也可以在闭包中局部重新声明它吗?
一个简单的例子是使用let,但它不适用于letJavascript 您可以使用变量,但也可以在闭包中局部重新声明它吗?,javascript,html,scope,closures,Javascript,Html,Scope,Closures,一个简单的例子是使用let,但它不适用于let let test=1 { console.log(test)//错误:初始化前无法访问“test” 让测试=2 } log(test)如果使用with语句注入可变对象作为作用域,这当然是可能的。然后您可以对其进行变异,以动态更改范围中的变量: a=1,context={}; (上下文){ 控制台日志(a); a=2; 控制台日志(a); } 控制台日志(a)如果您同意将代码包装在文本块中,那么您可以实现它,但是任何需要访问外部的代码都必须位于父
let test=1
{
console.log(test)//错误:初始化前无法访问“test”
让测试=2
}
log(test)
如果使用with
语句注入可变对象作为作用域,这当然是可能的。然后您可以对其进行变异,以动态更改范围中的变量:
a=1,context={};
(上下文){
控制台日志(a);
a=2;
控制台日志(a);
}
控制台日志(a)代码>如果您同意将代码包装在文本块中,那么您可以实现它,但是任何需要访问外部的代码都必须位于父块中,但是在我的例子中,这个解决方案工作得很好
var foo='outer';
{
var foo=‘内部’;
//代码的其余部分
}
console.log(foo);//“外部”
没有好办法。对于var
,这是不可能的,因为只有一个绑定,在内部重新分配它将反映在外部。通过使用链接答案中的方法检索外部值,可以使用let
,但很愚蠢。相反,请使用不同的变量名。@CertainPerformance如果您有一个不好的方法,我很乐意听您这么说,我很乐意使用eval或其他什么。这是一个自动的babel插件,用于继承作用域并访问当前作用域的父作用域,因此唯一的方法是使用相同的变量名:/@lopu babel可以创建无冲突标识符并重命名特定作用域中的变量。这样做,而不是一个运行时解决方案,它甚至不能正常工作。不,除非外部变量在顶层,否则我想这是不可能的,当然。如果你不需要在同一块中访问不同的变量绑定,那也可以检查我的答案你可以直接添加一个文本块{}
来进行破解你知道var
有函数作用域,而且它打印的是“内部”而不是“外部”(如预期的那样)@jonaswillms ah好吧,它与const一起工作,让:/