我对 JavaScript 中的作用域到底是如何工作的感到有点困惑,主要是词法作用域。我知道全局作用域中的变量可以在任何地方访问,在 JavaScript 中创建新作用域的唯一方法是通过创建函数(或在 ES6 中使用 let )。但是,我不太明白词法范围是什么/意味着什么。我查遍了互联网,找不到明确的解释。
我觉得我开始理解它了,但请让我与你们 JavaScript 向导确认一下,以确保我是正确的。
因此,根据我的理解,词法作用域意味着静态作用域,因此例如,函数的作用域不是由调用它的位置创建的,而是由函数本身创建的位置创建的。下面的代码演示了这个概念:
var x = "global";
function foo() {
console.log(x);
}
function bar() {
var x = "bar";
foo();
}
function baz() {
var x = "baz";
foo();
}
bar();
baz();
打印到控制台的内容是“全局”两次。这是因为当调用函数 foo 时,解释器首先检查 foo 的作用域以查看它是否具有变量“x”,然后检查全局作用域,而不是 bar 或 baz 作用域。变量“x”不是从调用函数 foo 的地方获取的,而是从它创建的地方获取的,因此具有词法作用域。我说得对吗?这有道理吗?
词法作用域的另一个例子是闭包,对吗?例如,内部函数可以访问外部函数的变量,无论由于词法作用域而在何处调用内部函数,对吗?
最后,我的最后一个例子是箭头函数。它们允许“this”的词汇范围,对吧?所以,举例来说,
var obj = {
name: "Rob",
print() {
setTimeout(() => {
console.log(this.name)
}, 1000);
}
};
如果“this”是标准内联函数,则“this”不会绑定到全局对象,而是绑定到 obj,因为“this”具有箭头函数的词法作用域。
我说的一切都正确吗?另外,有人能给我一个词法范围的明确定义吗? JavaScript 中还有其他我应该了解的词法作用域示例吗?
Thanks.