我正在学习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'已经被声明”而引发错误。因此它根本不允许重复声明。
有人可以帮助解释背后的逻辑吗?提前非常感谢!
答案 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
并将其替换为简单变量,则会看到相同的行为。