我有点困惑 JavaScript 中作用域是如何工作的,主要是词法作用域。我知道全局作用域中的变量可以在任何地方访问,并且在 JavaScript 中创建新作用域的唯一方法是通过创建函数(或使用 ES6 中的 let)。然而,我并不真正理解什么是词法作用域。我在互联网上搜索了很久,但没有找到清晰的解释。
我觉得我开始有点理解了,但还是想向你们这些 JavaScript 高手确认一下是否正确。
据我理解,词法作用域指的是静态作用域,例如,函数的作用域不是由调用它的位置创建的,而是由函数本身被创建的位置确定的。下面的代码演示了这个概念:
打印到控制台的内容是“全局”两次。这是因为当调用函数foo时,解释器首先检查foo的作用域是否有变量“x”,然后检查全局作用域,而不是bar或baz作用域。变量“x”被获取的位置不是函数foo被调用的位置,而是它被创建的位置,因此具有词法作用域。我的理解正确吗?这样说有意义吗?
另一个词法作用域的例子是闭包,对吗?例如,内部函数可以访问外部函数的变量,无论内部函数在何处被调用,这是因为具有词法作用域,正确吗?
最后,我的最后一个例子是箭头函数。它们允许“this”的词法作用域,对吗?例如,
我觉得我开始有点理解了,但还是想向你们这些 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。
我说的都对吗?还有,有没有人能给我一个清晰明了的词法作用域定义?在JavaScript中还有哪些其他词法作用域的例子值得我了解呢?
谢谢。
foo
、bar
和baz
是闭包。你的想法基本上是正确的。 - Aluan Haddad