我对代码的假设是,对于第二个let x
,上面的代码位于时间死区。因此不应该抛出错误。
代码
function f(condition, x) {
if (condition) {
let x = 100;
return x;
}
let x = 30; // <---- throw error
return x;
}
f(true, 1);
答案 0 :(得分:3)
这里的问题是你在同一个<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
中重新声明了同一个变量x
两次,因此变量function
将被悬挂。
x
此处,第二个 if (condition) {
//This x declaration is fine as it wasn't preceded with any others declaration inside the same block scope
let x = 100;
return x;
}
//Now this second x declaration will cause the hoisting problem
let x = 30; // <---- throw error
声明正在let x = 30;
范围内提升x
变量。所以结论是你不能在同一范围内多次声明同一个变量。
有关Javascript中可变提升的进一步阅读,请查看:
答案 1 :(得分:1)
问题似乎是 x 已经是一个与外部 x 具有相同范围的函数参数。如果我用 y 更改功能参数 x ,则代码可以正常工作。
<强>代码强>
function f(condition, y) {
if (condition) {
let x = 100;
return x;
}
let x = 30; // <---- doesnt throw error
return x;
}
f(true, 1);