Javascript var声明(如var x;)会覆盖以前的值吗
我正在学习javascript中的提升概念。阻止我的一段代码是: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值的原因是因为在这
函数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(){}
我认为在控制台中分别执行这两条语句会有不同的效果;但我之前的评论是对的,作业将在最后评估。非常感谢你回答我的问题!关于记忆水平的解释帮助很大!非常感谢你回答我的问题!非常感谢你回答我的问题!