try块中的JavaScript作用域
假设我正在尝试执行这个JavaScript代码段。假设未声明的变量和方法在上面的其他地方声明,并且try块中的JavaScript作用域,javascript,scope,Javascript,Scope,假设我正在尝试执行这个JavaScript代码段。假设未声明的变量和方法在上面的其他地方声明,并且something和somethingElse的计算结果为布尔真 try { if(something) { var magicVar = -1; } if(somethingElse) { magicFunction(magicVar); } } catch(e) { doSomethingWithError(e); }
something
和somethingElse
的计算结果为布尔真
try {
if(something) {
var magicVar = -1;
}
if(somethingElse) {
magicFunction(magicVar);
}
} catch(e) {
doSomethingWithError(e);
}
我的问题是:
magicVar
的范围是什么?可以像我所做的那样将其传递到magicFunction
中吗?对于var
,变量从函数的开始到结束都存在,无论它们在何处声明,或者即使语句实际上已经到达。但是,在为它们分配另一个值之前,它们将是未定义的
因此,在您的例子中,如果something
为false,但somethingelse
为true,您将调用magicFunction
,其第一个参数为undefined
let
关键字是在Javascript 1.9中创建的,并且仅在Firefox中可用(截至今天,2012年5月3日,据我所知),它声明的变量具有您可能已经习惯的范围语义。使用var
,变量从函数开始到函数结束都存在,无论它们声明在哪里,或者,即使这个陈述真的达到了。但是,在为它们分配另一个值之前,它们将是未定义的
因此,在您的例子中,如果something
为false,但somethingelse
为true,您将调用magicFunction
,其第一个参数为undefined
let
关键字是在Javascript 1.9中创建的,并且仅在Firefox中可用(截至今天,2012年5月3日,据我所知),它声明的变量具有您可能已经习惯的范围语义。- 在javascript中,仅函数创建一个新的上下文闭包李>
- 变量的每个定义实际上都是变量在其作用域顶部的声明,以及定义所在位置的赋值
- 功能范围
- 提升至其功能的顶部
- 同一作用域中相同名称的重新声明是无效的
吊装
您甚至可以执行以下操作:
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();
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
}
因此,foo
函数被转换为如下内容:
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();
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
}
我的问题是:magicVar的范围是什么?可以像我所做的那样将其传递到magicFunction中吗
定义好的…,是的,代码是有效的,但是如果变量声明位于顶部,那么代码的可读性就会降低,仅此而已。- 在javascript中,仅函数创建一个新的上下文闭包李>
- 变量的每个定义实际上都是变量在其作用域顶部的声明,以及定义所在位置的赋值
- 功能范围
- 提升至其功能的顶部
- 同一作用域中相同名称的重新声明是无效的
吊装
您甚至可以执行以下操作:
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();
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
}
因此,foo
函数被转换为如下内容:
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();
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
}
我的问题是:magicVar的范围是什么?可以像我所做的那样将其传递到magicFunction中吗
定义好的…,是的,代码是有效的,但是如果变量声明位于顶部,那么代码的可读性就会降低,仅此而已。Javascript具有函数范围。这意味着
magicvar
将从它声明的函数开始一直存在到该函数结束,即使该语句从未执行。这称为变量提升。函数声明也会发生同样的情况,而函数声明又被称为函数声明
如果变量是在全局范围内声明的,那么它对所有人都是可见的。这就是为什么全局变量在Javascript中被认为是邪恶的部分原因
如果something
为false,则示例将undefined
传递到magicFunction
,因为magicVar
尚未分配给任何对象
虽然这在技术上是有效的Javascript,但它通常被认为是糟糕的样式,不会通过jsLint之类的样式检查。像这样非常不直观的Javascript将执行,不会出现任何错误
alert(a); //alerts "undefined"
var a;
突击测验:以下代码的作用是什么
(function() {
x = 2;
var x;
alert(x);
})();
alert(x);
Javascript具有函数作用域。这意味着
magicvar
将从它声明的函数开始一直存在到该函数结束,即使该语句从未执行。这称为变量提升。函数声明也会发生同样的情况,而函数声明又被称为函数声明
如果变量是在全局范围内声明的,那么它对所有人都是可见的。这就是为什么全局变量在Javascript中被认为是邪恶的部分原因
如果something
为false,则示例将undefined
传递到magicFunction
,因为magicVar
尚未分配给任何对象
虽然这在技术上是有效的Javascript,但它通常被认为是糟糕的样式,不会通过jsLint之类的样式检查。像这样非常不直观的Javascript将执行,不会出现任何错误
alert(a); //alerts "undefined"
var a;
突击测验:以下代码的作用是什么
(function() {
x = 2;
var x;
alert(x);
})();
alert(x);
由于javascript“提升”(google it),您的变量声明代码被翻译为:
function yourFunction() {
var magicVar;
try {
if(something) {
magicVar = -1;
}
if(somethingElse) {
magicFunction(magicVar);
}
} catch(e) {
doSomethingWithError(e);
}
} //end of your function
“提升”将所有变量声明移动到函数顶部。因此,magicVar
在函数中的任何地方都可用,但是在您给它一个值之前它是未定义的
您的变量具有函数作用域。由于javascript“提升”(google it),您的变量声明代码被翻译为:
function yourFunction() {
var magicVar;
try {
if(something) {
magicVar = -1;
}
if(somethingElse) {
magicFunction(magicVar);
}
} catch(e) {
doSomethingWithError(e);
}
} //end of your function
“提升”将所有变量声明移动到t的顶部