JavaScript:如何确定变量的范围?

时间:2013-01-30 02:05:11

标签: javascript scope local-variables

如果我这样做:

var i = j = 0;
  1. j是局部变量吗?
  2. 证明它。

7 个答案:

答案 0 :(得分:6)

提升后,您的代码如下:

var i;
j = 0;
i = j;

因此i是一个局部变量,但j不是。

答案 1 :(得分:2)

j将是一个全局变量,或者被分配给out范围中的变量:

(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

答案 2 :(得分:2)

为了好玩,这是另一个“证据”:

(function() {"use strict"; var i = j = 0;}());
// throws "ReferenceError: assignment to undeclared variable j"

(Read more about strict mode)

答案 3 :(得分:1)

由于j的声明与i不在同一个声明表达式中,因此该变量要么在外部作用域中创建,要么在那里存在,它将覆盖外部的值。范围。

i现在是全局的原因是变量提升。你可以这样打破这个:

1)var i

2)j,现在在当前范围内声明j,这是包含范围,因为表达式未绑定到当前上下文,因为它没有使用var。 / p>

3)= 0,现在将j分配给0,然后将j分配给i

证明?

enter image description here

答案 4 :(得分:0)

(function(){
    var i = j = 0;
})();

try{
    alert(i);   
}catch(e){
    alert(e);  
}

alert(j);

http://jsfiddle.net/kDGM3/1/

不是特别证明...我也不会在正常的程序流程中使用异常,除非它确实是一个例外情况。但它确实证明了这种行为。

答案 5 :(得分:0)

function test(a){
    var i=j=0;
    return i;
};
test(100);
alert(j);
alert(i);

答案 6 :(得分:0)

检查它是否在window对象alert(window.j)上,如果它提示它的值,那么它是全局的,如果它不是本地的(如果它在使用var关键字时不在函数中那么它是全局的并且没有var那么无论你定义它都是全局的。所以j和i都是全局的。例如:

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一样使用alert(window.hasOwnProperty("i"))返回一个布尔值。

顺便说一句,尝试使用jsfiddle测试它会使i返回undefined(可能与jsfiddle保护它自己的全局命名空间的方式有关)所以你需要一个空白的html页面来测试这个