-1

你能帮我理解为什么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 上测试。

谢谢你们。

4

2 回答 2

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 中的提升概念而发生的。你可以从这里阅读提升

于 2016-03-03T09:53:58.557 回答
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 解释代码的方式,因此它始终是一个很好的规则。

于 2016-03-03T09:57:13.353 回答