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。请解释你的答案。请解释你的答案