1

如果我做:

var i = j = 0;
  1. j局部变量吗?
  2. 证明给我看。
4

7 回答 7

6

提升后,您的代码如下所示:

var i;
j = 0;
i = j;

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

于 2013-01-30T02:11:04.363 回答
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
于 2013-01-30T02:10:03.077 回答
2

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

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

(阅读有关严格模式的更多信息)

于 2013-01-30T02:14:51.507 回答
1

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

之所以i现在是全局的,是因为变量提升。你可以这样分解:

1)var i

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

3) = 0,现在分配j0,随后分配ji

证明?

在此处输入图像描述

于 2013-01-30T02:06:56.883 回答
0

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

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 页面来测试它

于 2013-01-30T02:26:42.140 回答
0
(function(){
    var i = j = 0;
})();

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

alert(j);

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

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

于 2013-01-30T02:12:26.490 回答
0
function test(a){
    var i=j=0;
    return i;
};
test(100);
alert(j);
alert(i);
于 2013-01-30T02:13:06.037 回答