为什么javascript在第二种情况下不会查找全局范围

时间:2014-12-24 10:20:04

标签: javascript

foo将在控制台

中执行时按预期查找b值为2
function foo() {
    console.log(b)
}
var b = 2
foo() // 2 for console.log

但是当我这样做时

function foo() {
    console.log(b)
    var b = 2
    console.log(b)
}
var b = 2
foo() // undefined for first console.log

它不再在全球范围内查找b为什么?

1 个答案:

答案 0 :(得分:6)

这是因为所谓的Javascript Hoisting,这就是javascript看到你代码的方式:

function foo() {
  var b; // javascript hoisted this variable on top
  console.log(b) // so here you see underfined
  b = 2;
  console.log(b);
}

现在因为javascript在函数之上提升了变量b,所以你的全局变量b从未使用过,因此在提升变量显示undefined之后,这个声明非常明显。因此,如果您从函数中删除新的声明(var关键字),您仍应该可以访问全局b变量。

顺便说一下,最好将所有变量声明在函数之上,如:

function foo() {
  var b = 2;
  console.log(b);
}

要了解有关该主题的更多信息,请参阅: