Javascript 未定义的变量在函数内部重新定义
Javascript Undefined variable redefined inside function
你能帮我理解为什么 JS 在这里这样工作吗?
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
func();
它returns我"undefined"。
如果我这样做
var timer = 3;
var func = function() {
alert(timer);
timer = 5;
}
func();
它按预期工作(警报 3)。
这是我没有正确理解的范围。
难道 JS 不应该在 alert 之后覆盖 "timer" 的定义吗?
刚在 chrome 上测试过。
谢谢你们。
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 中的提升概念。您可以从 here
阅读提升
变量提升很烦人,因为 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 的未知或被忽视的行为。
如果开发人员不理解提升,程序可能会包含 bug(错误)。
为避免错误,请始终在每个作用域的开头声明所有变量。
由于这是 JavaScript 解释代码的方式,因此它始终是一个很好的规则。
你能帮我理解为什么 JS 在这里这样工作吗?
var timer = 3;
var func = function() {
alert(timer);
var timer = 5;
}
func();
它returns我"undefined"。
如果我这样做
var timer = 3;
var func = function() {
alert(timer);
timer = 5;
}
func();
它按预期工作(警报 3)。
这是我没有正确理解的范围。 难道 JS 不应该在 alert 之后覆盖 "timer" 的定义吗?
刚在 chrome 上测试过。
谢谢你们。
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 中的提升概念。您可以从 here
阅读提升变量提升很烦人,因为 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 的未知或被忽视的行为。
如果开发人员不理解提升,程序可能会包含 bug(错误)。
为避免错误,请始终在每个作用域的开头声明所有变量。
由于这是 JavaScript 解释代码的方式,因此它始终是一个很好的规则。