不寻常的JavaScript行为

时间:2015-07-08 07:46:52

标签: javascript

我在javascript中遇到了一个奇怪的行为。请考虑以下代码:

var foo;
function bar(){
    function foo(){};
    foo = 10;
    return;
}
foo = 1;
bar();
console.log(foo);

这将输出1.但是如果我删除第三行中的foo函数声明,它将输出10.为什么在函数声明存在时它不输出10?如果我将该函数定义更改为以下是什么原因:

foo = function(){};

它会再次输出10?我知道函数声明的提升,但它似乎没有答案。

2 个答案:

答案 0 :(得分:0)

这并不奇怪 - 你有一个名为foo的变量,你正常设置为1。在bar函数内部,foo函数

  • 如果存在,请隐藏此变量
  • 如果不存在,foo会引用此原始变量。

因此,如果您定义foo函数,foo=10将对此生效,否则它将对原始foo生效。

关于问题的第二部分(如果你使用var foo=...,为什么会改回),那是因为在这种情况下,重复的变量声明被合并为一个,所以你最终得到的结果就像是你没有写var

答案 1 :(得分:0)

这是一个范围问题。用var定义的第一个foo是一个“全局”变量。如果foo函数也是bar函数中的“变量”,则foo赋值为10将对本地范围执行,因此全局foo您实际打印出来的内容不会被更改。但是,如果没有本地foobar内的分配将更改全局变量,从而打印10