【问题标题】:Whether the nested function hoisting affects the global variable (declared in the same function)?嵌套函数提升是否影响全局变量(在同一个函数中声明)?
【发布时间】:2019-10-01 23:36:21
【问题描述】:
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 应该在这里什么都不做,对吧?

【问题讨论】:

  • "我们已经看到属性名称 b 存在,所以代码 b = 7 什么都不做,继续进行" - 不。它做了一些事情,即分配给函数声明的现有局部变量b。在return 语句中,然后返回该局部变量。如果 b = 7 赋值没有做任何事情,f() 将返回函数。
  • 顺便说一句,您真的应该忘记那个“激活对象”术语。范围是一个记录,并且有一个变量b 的条目,而不是“属性名称”。

标签: javascript hoisting


【解决方案1】:

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

在上述代码中,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。

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2012-08-21
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多