try 块中的 JavaScript 作用域

新手上路,请多包涵

假设我正在尝试执行这个 JavaScript 片段。假设未声明的变量和方法在上面的其他地方声明,并且 somethingsomethingElse 评估为布尔值真。

 try {
    if(something) {
        var magicVar = -1;
    }

    if(somethingElse) {
        magicFunction(magicVar);
    }
} catch(e) {
    doSomethingWithError(e);
}

我的问题是: magicVar 的范围是什么,是否可以像我所做的那样将它传递给 magicFunction

原文由 user5243421 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 321
2 个回答

Javascript 具有函数作用域。这意味着 magicvar 将从它声明的函数的开头一直存在到该函数的结尾,即使该语句从未执行过。这称为 变量提升。函数声明也会发生同样的事情,这又称为 函数提升

如果变量在全局范围内声明,那么它将对 所有 对象可见。这是全局变量在 Javascript 中被认为是邪恶的部分原因。

Your example will pass undefined into magicFunction if something is false, because magicVar hasn’t been assigned to anything.

虽然这在技术上是有效的 Javascript,但它通常被认为是糟糕的风格,并且不会通过像 jsLint 这样的风格检查器。像这样极其不直观的 Javascript 将在没有任何错误的情况下执行

alert(a); //alerts "undefined"
var a;

流行小测验:以下代码的作用是什么?

 (function() {
  x = 2;
  var x;
  alert(x);
})();
alert(x);

原文由 Peter Olson 发布,翻译遵循 CC BY-SA 3.0 许可协议

关于 Javascript 如何使用 var 处理这个问题的很多其他好的答案,但我想我会解决 let 情况……

If a variable is defined with let inside the try block, it will NOT be in scope inside the catch (or finally ) block (s).它需要在封闭块中定义。

例如,在以下代码块中,控制台输出将为“Outside”:

 let xyz = "Outside";

try {
    let xyz = "Inside";

    throw new Error("Blah");
} catch (err) {
    console.log(xyz);
}

原文由 DrEnter 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏