如果我这样做:
var i = j = 0;
j
是局部变量吗?答案 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"
答案 3 :(得分:1)
由于j
的声明与i
不在同一个声明表达式中,因此该变量要么在外部作用域中创建,要么在那里存在,它将覆盖外部的值。范围。
i
现在是全局的原因是变量提升。你可以这样打破这个:
1)var i
2)j
,现在在当前范围内声明j
,这是包含范围,因为表达式未绑定到当前上下文,因为它没有使用var
。 / p>
3)= 0
,现在将j
分配给0
,然后将j
分配给i
。
证明?
答案 4 :(得分:0)
(function(){
var i = j = 0;
})();
try{
alert(i);
}catch(e){
alert(e);
}
alert(j);
不是特别证明...我也不会在正常的程序流程中使用异常,除非它确实是一个例外情况。但它确实证明了这种行为。
答案 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页面来测试这个