gpt4 book ai didi

javascript - 词汇范围问题

转载 作者:行者123 更新时间:2023-12-01 03:08:42 26 4
gpt4 key购买 nike

我正在阅读“你不懂 JS”系列中的“作用域与闭包”一书,我读到函数先提升,然后变量。浏览此代码片段:

function foo() {
var a = 2;
function bar() {
console.log( a ); // 2
}
bar();
}
foo();

如果是这种情况,函数 bar() 是否应该不提升到顶部并且此代码应该产生错误?因为吊装之后,这段代码应该是这样的(至少是我理解的)

function foo() {
function bar() {
console.log( a );
}
var a;
a = 2;
}

这是因为函数被提升到顶部和后面的变量。如果不是这样,请纠正我。

最佳答案

它们都被吊起一直到顶部,因此abar的范围内;这并不是说函数是“之上”变量。该顺序唯一起作用的时候是当函数声明和变量具有相同的名称时,在这种情况下,函数声明获胜,因为当变量被提升时,如果已经存在具有给定名称的现有绑定(bind),则不会创建它。

“提升”是一个方便的速记术语,但它不是字面意思。当 foo 被调用时会发生什么(省略一些细节来关注问题中的问题)是:

  1. 为调用 foo 创建执行上下文
  2. 在该上下文中创建一个对象来保存该上下文执行的标识符(如示例中的 bara)的“绑定(bind)”
  3. 处理所有函数声明,并将其标识符的绑定(bind)添加到对象中(如果有多个同名声明,则以最后一个为准)
  4. 所有变量声明都会被处理,并且它们的标识符会被添加到对象中如果对象还没有绑定(bind)它们

该对象随后用于处理执行上下文中的绑定(bind)(例如,当引用 a 时使用与绑定(bind)关联的值,并在 a 时设置已设置等)。

关于javascript - 词汇范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45996301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com