在JavaScript中阻止级别范围访问

Web*_*rer 0 javascript

我知道你会认为这是重复的,但我通过许多相关帖子找到的是人们用没有受过教育的"不"来淹没每个人,我很高兴这里还没有发生.无论哪种方式,我想重新讨论这个问题.

让我们举例说一下"不为人所知"的let陈述:

function foo()
{
    var bar = 5;

    if(true)
    {
        let bar = 10;
        alert(bar);
    }

    alert(bar);
}
Run Code Online (Sandbox Code Playgroud)

此功能将首先发出警报10然后发出警报5.

这是因为bar = 5功能级别范围内,而重新分配bar = 10仅保留在块级别范围内,这要归功于我们的小伙伴let.

话虽如此,JavaScript中的块级范围绝对存在,但我们如何访问它呢?

举个例子:

var arr = [
    {
        label: "x"
    },
    {
        label: "y"
    },
    {
        label: "z"
    },
];

var randIdx = Math.floor(Math.random() * 3);

for(var i = 0; i < arr.length; i++)
{
    if(i === randIdx)
        arr[i].value = true;
    else
        arr[i].value = false;
}

function foo()
{
    if(arr[0] || arr[1] || arr[2])
    {
        alert((\*passing argument*\).label);
    }
}

foo();
Run Code Online (Sandbox Code Playgroud)

必须可以访问当前语句的块作用域if并检索给定表达式的传递参数!块级范围确实存在,为什么我不能修补它!

谢谢!

Ori*_*iol 5

不,这是不可能的.该if声明被定义为

生产IfStatement:if ( Expression ) 语句 的计算方法如下:

  1. exprRef是评估Expression的结果.
  2. 如果ToBoolean(GetValue(exprRef))为false,则返回(normal,empty,empty).
  3. 返回评估Statement的结果.

如您所见,GetValue(exprRef)的结果不会存储在任何位置,因此您以后无法检索它.

相反,请考虑将条件表达式分配给变量:

var myVar;
if(myVar = SomeFunction()) {
    myVar; // value returned by `SomeFunction`
}
Run Code Online (Sandbox Code Playgroud)
var myVar;
if(myVar = (x || y || z)) { // Parentheses added for clarity
    myVar; // `x`, `y` or `z`
}
Run Code Online (Sandbox Code Playgroud)