我已经读过一个好的做法是放置一个var语句,它定义了每个函数顶部的所有局部变量。下面的代码说明了为什么这是一个好主意,因为在变量之后显然使用var 使得它未定义。
但有人可以告诉我为什么就是这种情况?
<html>
<head>
<script type="text/javascript">
window.onload = function() {
var a=1;
function foo() {
//a = 2; //outputs 2,2 because this overwrites the external variable value
//var a = 2; //outputs 2,1 because the "var" keyword creates a second variable with local scope which doesn't affect the external variable
console.log(a);
var a = 3; //ouputs "undefined,1" ???
}
foo();
console.log(a);
};
</script>
</head>
<body>
</body>
</html>
答案 0 :(得分:4)
function foo() {
console.log(a);
var a = 3;
}
相当于
function foo() {
var a;
console.log(a);
a = 3;
}
因为在JavaScript中变量声明被挂起但初始值设定项不是。
您可以通过以下示例看到这是真的:
e = 0;
function foo() {
e = 1;
try {
throw 2;
} catch (e) {
var e = 3;
alert("In catch " + e);
}
alert("Before end of function " + e);
}
foo();
alert("Outside function " + e);
警报
在捕获3中 功能结束前1 外部功能0
因为变量声明已被提升,因此函数外部的e
不会被e = 1
更改,但e = 3
会发生在catch
内,因此3
}不会影响函数末尾的e
,而是覆盖异常值。