你能帮我理解为什么JS在这里这样工作吗?
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
func();
它让我“未定义”。
如果我这样做
var timer = 3;
var func = function() {
alert(timer);
timer = 5;
}
func();
它按预期工作(警报3)。
这是我无法正确理解的范围。 在警报之后,JS不应该覆盖“计时器”的定义吗?
仅在Chrome上测试过。
谢谢你们。
答案 0 :(得分:4)
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
当js解释时,此代码变为此;
var timer = 3;
var func = function() {
var timer; // Here local variable timer is undefined
alert(timer); // here local var timer alerts rather than global var timer
timer = 5; // here timer got initialized
}
这是因为在javascript中提升概念。你可以阅读提升frome here
答案 1 :(得分:0)
可变提升令人烦恼,因为javascript' hoists' (发送变量声明)到当前范围的顶部。
但是,它不会将初始化发送到当前范围的顶部。
所以:
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
变为:
var timer = 3;
var func = function() {
var timer;
alert(timer);
timer = 5;
}
解释时。
对许多开发人员来说,吊装是一种未知或被忽视的JavaScript行为。
如果开发人员不了解吊装,程序可能包含错误(错误)。
为避免错误,请始终在每个范围的开头声明所有变量。
由于这是JavaScript解释代码的方式,因此它始终是一个很好的规则。