try块中的JavaScript范围

use*_*421 27 javascript scope

假设我正在尝试执行此JavaScript代码段.假设未声明的变量和方法在其他地方,上面和那里声明,something并且somethingElse计算为boolean-true.

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

    if(somethingElse) {
        magicFunction(magicVar);
    }
} catch(e) {
    doSomethingWithError(e);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我的工作范围是什么magicVar,是否可以通过magicFunction

小智 40

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

如果lettry块内部定义变量,则它不在catch(或finally)块内的范围内.它需要在封闭块中定义.

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

let xyz = "Outside";

try {
    let xyz = "Inside";

    throw new Error("Blah");
} catch (err) {
    console.log(xyz);
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*son 25

Javascript具有功能范围.这意味着magicvar它将从函数的开头一直存在到该函数的结尾,即使该语句不执行.这称为可变吊装.函数声明也会发生同样的事情,而函数声明又被称为函数提升.

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

你的榜样将传递undefinedmagicFunction,如果something是假的,因为magicVar没有被分配到任何东西.

虽然这在技术上是有效的Javascript,但它通常被认为是糟糕的风格,并且不会传递像jsLint这样的样式检查器.非常不直观的这样的Javascript将执行没有任何错误

alert(a); //alerts "undefined"
var a;
Run Code Online (Sandbox Code Playgroud)

POP测验:以下代码有什么作用?

(function() {
  x = 2;
  var x;
  alert(x);
})();
alert(x);
Run Code Online (Sandbox Code Playgroud)

  • @gdoron我仍然不明白你的意思.我的观点是[此代码](http://jsfiddle.net/6bNZp/)将运行没有错误,而[此代码](http://jsfiddle.net/yJMaZ/1/)将抛出错误. (2认同)
  • 警告 **two** 然后抛出错误?(如果 x 没有在外层作用域中定义) (2认同)

Mar*_*arc 6

由于 javascript“提升”(MDN 描述),您的变量声明代码被翻译为:

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

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

} //end of your function
Run Code Online (Sandbox Code Playgroud)

“提升”将所有变量声明移动到函数的顶部。somagicVar在函数中随处可用,但在给它赋值之前它是未定义的。

你的变量有函数作用域。


gdo*_*ica 5

  • 在javascript中,只有函数创建一个新的context -closure.
  • 变量的每个定义实际上都是其范围顶部的变量声明,以及定义所在位置的赋值.

VAR

  • 函数作用域
  • 提升到其功能的顶部
  • 同一范围内同名的重新声明是无操作

您可能想要阅读MDN范围备忘单

由于hoisting你甚至可以做这样的事情:

function bar() {
    var x = "outer";

    function foo() {
        alert(x); // {undefined} Doesn't refer to the outerscope x
        // Due the the var hoising next:        
        x = 'inner';
        var x;
        alert(x); // inner

    }
    foo();
}

bar();?

bar();?
Run Code Online (Sandbox Code Playgroud)

演示

所以foo函数转换成这样的东西:

function foo() {
    var x;
    alert(x); // {undefined} Doesn't refer to the outerscope x
    // Due the the var hoising next:        
    x = 'inner';
    alert(x); // inner
}?
Run Code Online (Sandbox Code Playgroud)

我的问题是:magicVar的范围是什么,可以像我一样将它传递给magicFunction吗?

定义 ......,是的,代码是有效的,但是如果变量声明在顶部,那么它的可读性就会降低,这就是全部.