Javascript 在这个场景中范围是如何工作的?

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

为什么这段代码会在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
        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);
}