Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.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_Html_Scope_Closures - Fatal编程技术网

Javascript 您可以使用变量,但也可以在闭包中局部重新声明它吗?

Javascript 您可以使用变量,但也可以在闭包中局部重新声明它吗?,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,但它不适用于let

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一起工作,让:/