JavaScript 中的函数参数是否被提升?

Abd*_*ood 5 javascript hoisting executioncontext

function foo(a,b){
  return a + b;
}

foo(1,2);
Run Code Online (Sandbox Code Playgroud)

函数参数是否提升?

函数执行上下文创建阶段的变量环境是否看起来像这样:

VE = {
        { 0 : undefined , 1: undefined, length: 2 },
        {a : undefined, b: undefined},
        outer: refToGlobalLE
     }
Run Code Online (Sandbox Code Playgroud)

Rus*_*kar 2

不,函数参数不会在 JavaScript 中提升。

function foo(a,b){
  return a + b;
}

foo(1,2);
Run Code Online (Sandbox Code Playgroud)

为了向您简要解释整个过程,我想解释一下函数本身是如何被调用的。因此,既然您谈论的是变量环境(在本例中将是全局执行上下文),则基本上逐行执行代码的 JavaScript 执行线程会将函数定义代码存储为 foo 变量的值内存并且它还没有执行它(它只是按原样保存定义)。它移动到下一个执行行,该执行行显然对 foo 函数定义进行了函数调用(使用括号)。

现在,当该函数被调用 foo(1,2) 时,首先会在该 foo 函数的全局执行中创建一个新的执行上下文。你可以把它想象成一个内部抽象的盒子。参数 1 和 2 与函数的“a”和“b”参数映射为 foo 执行上下文中的变量,而不是全局执行上下文。然后,该函数只是通过调用堆栈将 a+b 的值返回到全局执行上下文。

好的,为了检查这一点,如果您刚刚调用该函数,然后像下面这样定义它

foo(1,2);

function foo(a,b){
  return a + b;
}
Run Code Online (Sandbox Code Playgroud)

您可能会收到错误,因为 foo 函数定义不存在于全局执行上下文中,并且基本上会导致引用错误。

现在,讨论参数本身,无论它们是否被提升。那就不要!当调用函数并创建新的执行上下文时,它们本身就会创建。这些变量的作用域是函数的块,并且对外部/全局执行上下文不可见。因此,当函数返回给被调用者时,其中的变量将被垃圾收集。

希望这能回答你的问题。

  • 我认为这个答案是不正确的。请看我的回答。 (2认同)