Javascript var声明(如var x;)会覆盖以前的值吗

Javascript var声明(如var x;)会覆盖以前的值吗,javascript,function,variables,Javascript,Function,Variables,我正在学习javascript中的提升概念。阻止我的一段代码是: 函数foo(){ 控制台日志(8); } var foo; console.log(foo)var foo仅指向foo的内存位置。碰巧您已经在那里声明了一个函数,所以foo的值仍然是函数 这和你做了没有什么不同: var x = 2; var x; // We're not setting a value with `=`, so nothing gets overridden x; // 2 函数是foo值的原因是因为在这

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

函数foo(){
控制台日志(8);
}
var foo;

console.log(foo)
var foo
仅指向
foo
的内存位置。碰巧您已经在那里声明了一个函数,所以
foo
的值仍然是函数

这和你做了没有什么不同:

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

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

var foo;
你只是在说foo
——这句话什么都没用

如果您实际将
foo
设置为某个对象,例如“FooBar”:

函数foo(){
控制台日志(8);
}
var foo=“FooBar”;

console.log(foo)
var foo
语句声明
foo
变量,并将其值设置为undefined(如果它已经没有值)。您的
foo
有一个值,因为
var foo实际上什么都不做

如果删除
foo函数
并用一个简单变量替换它,您将看到相同的行为

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

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

  • 重复的声明将被忽略
  • 函数声明在末尾求值,并分配给它们各自的名称
在全局范围中,因为
foo
既是函数名也是变量声明,所以变量声明被忽略。由于它没有初始值设定项,
foo
的值在实际计算该行时不会改变

详情请参阅


问题2:我在一个在线编辑器中输入了相同的代码,它会抛出错误,因为“标识符‘foo’已经声明”。所以它根本不允许重复声明


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

您使用的是什么版本的Chrome?定义函数的控制台输出也是未定义的,我认为这不正确。如果先声明并赋值一个变量,然后用相同的名称声明一个函数,则该名称将保留变量值。JS提升中有优先规则。@Aioros yes,函数在变量之前提升;但是,在第一次调用函数之前的变量赋值将覆盖符号绑定。@在Chrome 71控制台中对其进行的Aioros测试表明情况并非如此。我做到了:
varx=2
然后
函数x(){}
然后
x
这会给出
ƒx(){}
我认为在控制台中分别执行这两条语句会有不同的效果;但我之前的评论是对的,作业将在最后评估。非常感谢你回答我的问题!关于记忆水平的解释帮助很大!非常感谢你回答我的问题!非常感谢你回答我的问题!