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

zhq*_*vvn 2 javascript hoisting

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

a = f();
console.log(a); //output: 7
console.log(b); //output: 7
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,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
Run Code Online (Sandbox Code Playgroud)

在我看来,由于函数 b 在函数 f 中提升,因此首先在激活对象上创建对函数 b 的引用,当我们得到解释器 gets 时,b = 7我们已经看到属性名称 b 存在,因此代码b = 7不执行任何操作并继续进行,从而console.log(b)输出4. 但怎么还是console.log(a)有输出7呢?b = 7在这里应该什么也不做,对吧?

Jac*_*cob 5

对于第一段代码,这个断言是不准确的:

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

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

在第二个代码块中,您对提升的作用存在误解。将提升视为简单地将声明移动到其范围的顶部,因此:

function f() {
  b = 7;
  return b;
  function b() {}
}
Run Code Online (Sandbox Code Playgroud)

...行为就好像您这样做了:

function f() {
  let b = function () { }
  b = 7;
  return b;
}
Run Code Online (Sandbox Code Playgroud)

在线上b = 7,您正在为局部变量分配一个新值。因此返回 7。7breturn b;