【问题标题】:Javascript Undefined variable redefined inside function [duplicate]Javascript未定义变量在函数内部重新定义[重复]
【发布时间】:2016-06-16 13:40:11
【问题描述】:

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

谢谢你们。

【问题讨论】:

  • 它被称为variable hoisting.. 只需查找相同的。
  • 吊装。每当您定义 var xxx 时,var 定义就会移动到作用域的顶部(在本例中是函数的第一行;在 alert() 之前)。

标签: javascript undefined redefine


【解决方案1】:
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阅读提升

【讨论】:

  • 虽然如此,但您可能应该提供一两个链接来解释变量提升,而不是“这就是发生的事情”。
  • 或者只是将其标记为 DUPE...
【解决方案2】:

变量提升很烦人,因为 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 解释代码的方式,它总是一个好的规则。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2013-04-28
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多