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)
不,函数参数不会在 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 函数定义不存在于全局执行上下文中,并且基本上会导致引用错误。
现在,讨论参数本身,无论它们是否被提升。那就不要!当调用函数并创建新的执行上下文时,它们本身就会创建。这些变量的作用域是函数的块,并且对外部/全局执行上下文不可见。因此,当函数返回给被调用者时,其中的变量将被垃圾收集。
希望这能回答你的问题。
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |