执行上下文声明了两次名称?

时间:2016-07-31 16:02:16

标签: javascript scope interpreter execution hoisting

我正在研究Javascript的执行上下文。但我不明白为什么“函数foo”不会被“var foo”覆盖。 我希望有人可以解释一下, 谢谢你的回应。

function ace(){

console.log(typeof foo); // function pointer
console.log(typeof bar); // undefined

var foo = 'hello',
    bar = function() {
        return 'world';
    };

function foo() {
    return 'hello';
}
 var foo = 'hello';

}

ACE();

2 个答案:

答案 0 :(得分:0)

  

为什么“函数foo”不会被“var foo”覆盖。

foo会在重新定义foo的行中被覆盖

function ace() {

  console.log(typeof foo); // function pointer
  console.log(typeof bar); // undefined

  var foo = 'hello',
    bar = function() {
      return 'world';
    };

  function foo() {
    return 'hello';
  }
  var foo = 'hello';
  console.log(foo);
  try {
    foo()
  } catch(e) {
    console.log("catch:", e.message)
  }
}

ace();

答案 1 :(得分:0)

  

但我不明白为什么"功能foo"不会被" var foo"。

覆盖

var声明不会覆盖函数声明。它们都声明了相同的变量,并且由于函数声明,它是用函数初始化的。只有赋值才会覆盖该值。

如果您考虑吊装,您的脚本将表现得像

function ace() {
    var foo, bar;
    var foo = function() {
        return 'hello';
    }
    var foo;

    console.log(typeof foo); // function
    console.log(typeof bar); // undefined

    foo = 'hello';
    bar = function() {
        return 'world';
    };
    console.log(typeof foo); // string
    foo = 'hello';
}
ace();