var声明(例如var x;)会覆盖先前的值

时间:2019-01-15 23:22:18

标签: javascript function variables

我正在学习javascript中的吊装概念。阻止我的一段代码是:

function foo() {
  console.log(8);
}

var foo;

console.log(foo);

问题1: 我在chrome控制台中输入了此代码,打印出的是

function foo(){
    console.log(8)
}

变量声明会覆盖函数声明吗?我认为打印的应该是undefined

问题2: 我在在线编辑器https://jsbin.com/dezixozewi/edit?js,console中键入了相同的代码,因为“标识符'foo'已经被声明”而引发错误。因此它根本不允许重复声明。

有人可以帮助解释背后的逻辑吗?提前非常感谢!

4 个答案:

答案 0 :(得分:1)

函数是foo的值的原因是因为在这一行:

var foo;

您只是在说foo-这是一条不执行任何操作的语句。

如果您实际上将foo设置为某些内容,例如“ FooBar”:

function foo() {
  console.log(8);
}

var foo = "FooBar";

console.log(foo);

它会覆盖该函数,因为如this question所示,用var声明任何值是一个值,将导致该值“提升”到顶部,因此是实际值标识符。

答案 1 :(得分:1)

  

变量声明会覆盖函数声明吗?

不。在执行任何代码之前,运行时将查找所有函数和变量声明,并使用它们初始化新作用域。在评估脚本代码和评估函数范围之间,事情略有不同,但是结果是相同的:

  • 重复的声明将被忽略。
  • 函数声明在末尾求值,并分配给它们各自的名称。

在全局范围内,由于foo既是函数名又是变量声明,因此将忽略变量声明。并且由于它没有初始化程序,因此foo的值在实际评估该行时不会改变。

详细信息可以在language specification中找到。


  

问题2:我在在线编辑器https://jsbin.com/dezixozewi/edit?js,console中输入了相同的代码,因为“标识符'foo'已经被声明”而引发错误。因此它根本不允许重复声明。

不清楚jsbin如何评估代码,但是它是有效的。

答案 2 :(得分:0)

var foo;仅指向foo的存储位置。碰巧您已经在那里声明了一个函数,所以这就是foo的值仍然是该函数的原因。

这与您做的没什么不同

var x = 2;
var x; // We're not setting a value with `=`, so nothing gets overridden 
x; // 2

答案 3 :(得分:0)

var foo;语句声明foo变量,并将其值设置为未定义的(如果它尚无值)。您的foo有一个值,因为var foo;实际上没有任何作用。

如果删除foo function并将其替换为简单变量,则会看到相同的行为。