Javascript 在这个场景中范围是如何工作的?
为什么这段代码会在if块中抛出错误,Javascript 在这个场景中范围是如何工作的?,javascript,ecmascript-6,constants,Javascript,Ecmascript 6,Constants,为什么这段代码会在if块中抛出错误, 引用错误:未定义x?我理解定义另一个名为x的变量看起来是错误的,但它不应该在定义新常量x时抛出错误吗 'use strict' function task() { const x = 5 return _subTask({x, condition: true}) } function _subTask({x, condition}) { if (condition) { const y = x * 10
引用错误:未定义x
?我理解定义另一个名为x的变量看起来是错误的,但它不应该在定义新常量x时抛出错误吗
'use strict'
function task() {
const x = 5
return _subTask({x, condition: true})
}
function _subTask({x, condition}) {
if (condition) {
const y = x * 10
const x = y * 10
return x
} else {
return 0
}
}
console.log(task())
我理解定义另一个叫做x的变量看起来是错误的,但是
当定义新的const x时,它不应该抛出错误吗
x
作为一个常量
在该if块中定义之前不能被访问
但是,如果
函数任务()
{
常数x=5
返回_子任务({x,条件:true})
}
函数_子任务({x,条件})
{
console.log(x);//这将很好地打印
如果(条件){
常数y=x*10//这也将给出一个错误
常数x=y*10
返回x
}否则{
返回0
}
}
console.log(task())
我理解定义另一个叫做x的变量看起来是错误的,但是
当定义新的const x时,它不应该抛出错误吗
x
作为一个常量
在该if块中定义之前不能被访问
但是,如果
函数任务()
{
常数x=5
返回_子任务({x,条件:true})
}
函数_子任务({x,条件})
{
console.log(x);//这将很好地打印
如果(条件){
常数y=x*10//这也将给出一个错误
常数x=y*10
返回x
}否则{
返回0
}
}
console.log(task())
在y
声明中用作x
的现在指的是已分解的参数,因为本地定义包含在另一个块中
在
y
声明中用作x
的现在指的是已分解的参数,因为局部定义包含在另一个块中。您在这里称为临时死区(TDZ)的错误。根据ES6,如果块中存在let或const。在let或const declarison之前,无法访问变量
{
// TDZ start here
// x can not been accessed
const y = x * 10
const x = y * 10
return x
}
这里的错误称为暂时死区(TDZ)。根据ES6,如果块中存在let或const。在let或const declarison之前,无法访问变量
{
// TDZ start here
// x can not been accessed
const y = x * 10
const x = y * 10
return x
}
这是因为时间死区(TDZ)。当访问代码后面部分中定义的
let
或const
变量时,称其处于TDZ中,将抛出ReferenceError
<代码>让和常量
变量不提升。您可以在中阅读更多关于TDZ的信息
在本例中,您的意思是使用语句const y=x*10
中函数参数的x
值。由于您已在该范围内本地声明了x
,因此优先级更高。当控件达到const y=x*10
时,由于x
处于TDZ,访问它会抛出该错误
要解决此问题,您需要在任意位置使用不同的变量名,而不是x
。作为一般的良好实践,始终使用唯一的变量名
在您的特定情况下,除非需要从多个位置调用
\u子任务
函数,否则可以像这样简化任务
实现
function task() {
const x = 5;
return (condition ? x * 100 : 0);
}
这是因为时间死区(TDZ)。当访问代码后面部分中定义的
let
或const
变量时,称其处于TDZ中,将抛出ReferenceError
<代码>让和常量
变量不提升。您可以在中阅读更多关于TDZ的信息
在本例中,您的意思是使用语句const y=x*10
中函数参数的x
值。由于您已在该范围内本地声明了x
,因此优先级更高。当控件达到const y=x*10
时,由于x
处于TDZ,访问它会抛出该错误
要解决此问题,您需要在任意位置使用不同的变量名,而不是x
。作为一般的良好实践,始终使用唯一的变量名
在您的特定情况下,除非需要从多个位置调用
\u子任务
函数,否则可以像这样简化任务
实现
function task() {
const x = 5;
return (condition ? x * 100 : 0);
}