假设我正在尝试执行此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问题......
如果let在try块内部定义变量,则它不在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中被认为是邪恶的部分原因.
你的榜样将传递undefined到magicFunction,如果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)
由于 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在函数中随处可用,但在给它赋值之前它是未定义的。
你的变量有函数作用域。
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吗?
定义好 ......,是的,代码是有效的,但是如果变量声明在顶部,那么它的可读性就会降低,这就是全部.