嵌套函数的提升是否会影响全局变量(在同一函数中声明)?

时间:2019-10-01 23:36:21

标签: javascript hoisting

var b = 4;
function f() {
  b = 7;
  return b;
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 7

在上面的代码中,b = 7使b自动成为全局变量,从而将var b的值更改为7。但是,当如下添加嵌套函数b时,我对输出结果感到困惑:

var b = 4;
function f() {
  b = 7;
  return b;
  function b() {}
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 4

我认为,由于功能b悬挂在功能f中,因此首先在激活对象上创建了对功能b的引用,当我们将解释器获取到b = 7时,我们已经看到了属性名称b存在,因此代码b = 7不执行任何操作并继续进行,因此console.log(b)输出4。但是console.log(a)为何仍输出7b = 7在这里什么也不做,对吧?

1 个答案:

答案 0 :(得分:4)

对于第一段代码,此声明不正确:

  

在上面的代码中,b = 7使b自动全局,从而将var b的值更改为7。

在语句b = 7中,b绑定到外部var b声明,因此b = 7 分配给闭包中的b变量

在第二段代码中,您对起重的工作有误解。认为吊装只是将声明移到其作用域的顶部,所以:

function f() {
  b = 7;
  return b;
  function b() {}
}

...的行为就像您这样做:

function f() {
  let b = function () { }
  b = 7;
  return b;
}

在行b = 7上,您正在新值7分配给局部变量b。因此return b;返回7。