JavaScript:如何确定变量的作用域?
如果我这样做:JavaScript:如何确定变量的作用域?,javascript,scope,local-variables,Javascript,Scope,Local Variables,如果我这样做: var i = j = 0; j是局部变量吗? 证明它。 由于j的声明与i不在同一个声明表达式中,因此该变量要么在外部范围中创建,要么(如果存在)覆盖外部范围中的值 我之所以现在是全球化的,是因为我的提升力是可变的。你可以这样分解: 1变量i 2 j,它现在在当前范围中声明j,该范围是包含范围,因为表达式没有绑定到当前上下文,因为它没有使用var 3=0,现在将j赋值为0,随后将j赋值为i 证据 由于j的声明与i不在同一个声明表达式中,因此该变量要么在外部范围中创建,要么(如果
var i = j = 0;
j是局部变量吗?
证明它。
由于j的声明与i不在同一个声明表达式中,因此该变量要么在外部范围中创建,要么(如果存在)覆盖外部范围中的值
我之所以现在是全球化的,是因为我的提升力是可变的。你可以这样分解:
1变量i
2 j,它现在在当前范围中声明j,该范围是包含范围,因为表达式没有绑定到当前上下文,因为它没有使用var
3=0,现在将j赋值为0,随后将j赋值为i
证据
由于j的声明与i不在同一个声明表达式中,因此该变量要么在外部范围中创建,要么(如果存在)覆盖外部范围中的值
我之所以现在是全球化的,是因为我的提升力是可变的。你可以这样分解:
1变量i
2 j,它现在在当前范围中声明j,该范围是包含范围,因为表达式没有绑定到当前上下文,因为它没有使用var
3=0,现在将j赋值为0,随后将j赋值为i
证据
j将是一个全局变量,或被分配到范围外的变量:
(function() { var i = j = 0; })()
// i is undefined
// j is 0
var i = 42;
var j = 1;
(function() { var i = j = 0; })()
// i remains 42
// j is 0
j将是一个全局变量,或被分配到范围外的变量:
(function() { var i = j = 0; })()
// i is undefined
// j is 0
var i = 42;
var j = 1;
(function() { var i = j = 0; })()
// i remains 42
// j is 0
提升后,您的代码如下所示:
var i;
j = 0;
i = j;
因此i是一个局部变量,而j不是。提升后,您的代码如下所示:
var i;
j = 0;
i = j;
因此i是局部变量,而j不是
不是特别的证明…我也不会在正常的程序流中使用异常,除非它确实是一个例外情况。但它确实证明了这种行为
function test(a){
var i=j=0;
return i;
};
test(100);
alert(j);
alert(i);
不是特别的证明…我也不会在正常的程序流中使用异常,除非它确实是一个例外情况。但它确实证明了这种行为。为了好玩,这里有另一个证据:
function test(a){
var i=j=0;
return i;
};
test(100);
alert(j);
alert(i);
(function() {"use strict"; var i = j = 0;}());
// throws "ReferenceError: assignment to undeclared variable j"
为了好玩,这里有另一个证明:
(function() {"use strict"; var i = j = 0;}());
// throws "ReferenceError: assignment to undeclared variable j"
检查它是否在窗口对象alertwindow.j上如果它警告它的值,那么它是全局的如果不是局部的如果在使用var关键字时它不在函数中,那么它是全局的,没有var,那么它是全局的,无论您定义它。所以我和j都是全球性的。例如:
var i = j = 0;
function x(){
var r = 100;
alert(r);
}
alert(window.i); //will alert 0.
alert(window.j); //will alert 0.
x(); // will alert 100.
alert(window.r); //will alert undefined.
或者您可以使用hasOwnProperty,如so alertwindow.hasOwnPropertyi,它返回一个布尔值
顺便说一下,尝试使用JSFIDLE测试这一点会使我返回undefined可能与JSFIDLE保护其自身全局命名空间的方式有关,因此您需要一个空白html页面来测试这一点检查它是否在窗口对象alertwindow上。j如果它警告它的值,那么它是全局的,如果不是,那么它是本地的,如果它在使用var关键字,然后它是全局的,没有var,那么它是全局的,不管你定义它。所以我和j都是全球性的。例如:
var i = j = 0;
function x(){
var r = 100;
alert(r);
}
alert(window.i); //will alert 0.
alert(window.j); //will alert 0.
x(); // will alert 100.
alert(window.r); //will alert undefined.
或者您可以使用hasOwnProperty,如so alertwindow.hasOwnPropertyi,它返回一个布尔值
顺便说一句,尝试使用jsfiddle测试这一点会使我返回undefined,这可能与jsfiddle保护自己的全局名称空间的方式有关,因此您需要一个空白的html页面来测试这一点,这是我的怀疑,但是如何通过编程证明呢?@MattDiPasquale将typeof的结果与“undefined”进行比较?这是我的怀疑,但如何通过编程证明呢?@MattDiPasquale将typeof的结果与“undefined”进行比较呢?这取决于j是否在环境中更早声明:P。因为该语句的计算结果为var i=j=0;应该清楚的是,var关键字不适用于j。这取决于j是否在环境中更早声明:P。因为该语句的计算结果为var i=j=0;很明显,var关键字不适用于j。请解释你的答案。请解释你的答案