我在javascript中遇到了一个奇怪的行为。请考虑以下代码:
var foo;
function bar(){
function foo(){};
foo = 10;
return;
}
foo = 1;
bar();
console.log(foo);
这将输出1.但是如果我删除第三行中的foo函数声明,它将输出10.为什么在函数声明存在时它不输出10?如果我将该函数定义更改为以下是什么原因:
foo = function(){};
它会再次输出10?我知道函数声明的提升,但它似乎没有答案。
答案 0 :(得分:0)
这并不奇怪 - 你有一个名为foo
的变量,你正常设置为1。在bar
函数内部,foo
函数
foo
会引用此原始变量。因此,如果您定义foo函数,foo=10
将对此生效,否则它将对原始foo生效。
关于问题的第二部分(如果你使用var foo=...
,为什么会改回),那是因为在这种情况下,重复的变量声明被合并为一个,所以你最终得到的结果就像是你没有写var
。
答案 1 :(得分:0)
这是一个范围问题。用var定义的第一个foo
是一个“全局”变量。如果foo
函数也是bar
函数中的“变量”,则foo
赋值为10将对本地范围执行,因此全局foo
您实际打印出来的内容不会被更改。但是,如果没有本地foo
,bar
内的分配将更改全局变量,从而打印10