在JavaScript中阻止级别范围访问

时间:2015-04-16 20:01:05

标签: javascript

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

让我们看一下“不为人知的”let陈述:

function foo()
{
    var bar = 5;

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

    alert(bar);
}

此功能将首先提醒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();

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

谢谢!

1 个答案:

答案 0 :(得分:5)

不,这是不可能的。 if statement定义为

  

制作 IfStatement if ( 表达式 ) 声明   评估如下:

     
      
  1. exprRef 成为评估 Expression 的结果。
  2.   
  3. 如果ToBooleanGetValue exprRef )) false ,请返回(正常,空,空)。
  4.   
  5. 返回评估 Statement 的结果。
  6.   

正如您所看到的,GetValue( exprRef )的结果不会存储在任何地方,因此您无法在以后检索它。

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

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