如果我做:
var i = j = 0;
- 是
j
局部变量吗? - 证明给我看。
提升后,您的代码如下所示:
var i;
j = 0;
i = j;
因此i
是一个局部变量,但j
不是。
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
为了好玩,这是另一个“证明”:
(function() {"use strict"; var i = j = 0;}());
// throws "ReferenceError: assignment to undeclared variable j"
由于 的声明 与j
不在同一个声明表达式中i
,因此变量要么在外部范围内创建,要么如果存在,它将覆盖外部范围内的值。
之所以i
现在是全局的,是因为变量提升。你可以这样分解:
1)var i
2) j
,它现在j
在当前范围内声明,这是包含范围,因为表达式没有绑定到当前上下文,因为它没有使用var
.
3) = 0
,现在分配j
给0
,随后分配j
给i
。
证明?
检查它是否在window
对象上,如果它警告它的值,那么它是全局的,如果它不是本地的(如果它在使用关键字alert(window.j)
时不在函数中,那么它是全局的,如果没有,那么它是全局的,无论你定义它。所以 j 和 i 都是全球的)。例子:var
var
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 页面来测试它
(function(){
var i = j = 0;
})();
try{
alert(i);
}catch(e){
alert(e);
}
alert(j);
不是特别证明......我也不会在正常程序流程中使用异常,除非它确实是一个例外情况。但它确实展示了这种行为。
function test(a){
var i=j=0;
return i;
};
test(100);
alert(j);
alert(i);