返回
javascript 中的神秘词法作用域
前端
2024-02-17 01:34:14
词法作用域
javascript 采用词法作用域,也称为静态作用域。这意味着变量的作用域由其声明位置决定,而不是由其执行位置决定。换句话说,变量的作用域由代码的结构来确定,而不是由代码的运行时行为来确定。
词法作用域的一些特点:
- 变量在定义时就确定了其作用域,而不是在执行时。
- 内部作用域可以访问外部作用域的变量,但外部作用域不能访问内部作用域的变量。
- 作用域是嵌套的,每个作用域都有自己的变量。
- 当离开一个作用域时,该作用域的变量就会被销毁。
让我们看一个代码示例:
// 全局作用域
var x = 10;
function foo() {
// 局部作用域
var y = 20;
console.log(x); // 10
console.log(y); // 20
}
foo();
console.log(x); // 10
console.log(y); // ReferenceError: y is not defined
在这个示例中,全局作用域和局部作用域是嵌套的。局部作用域可以访问全局作用域的变量 x,但全局作用域不能访问局部作用域的变量 y。当离开局部作用域时,局部作用域的变量 y 就被销毁了。
对比动态作用域
词法作用域和动态作用域是两种不同的作用域类型。在动态作用域中,变量的作用域由其执行位置决定。这意味着变量的作用域可以随着代码的执行而改变。
动态作用域的一些特点:
- 变量的作用域由其执行位置决定,而不是由其声明位置决定。
- 内部作用域可以访问外部作用域的变量,但外部作用域不能访问内部作用域的变量。
- 作用域不是嵌套的,变量的作用域可以随着代码的执行而改变。
- 当离开一个作用域时,该作用域的变量不会被销毁。
让我们看一个动态作用域的代码示例:
// 全局变量
var x = 10;
function foo() {
// 局部变量
var y = 20;
function bar() {
// 内部变量
var z = 30;
console.log(x); // 10
console.log(y); // 20
console.log(z); // 30
}
bar();
}
foo();
在这个示例中,全局作用域、局部作用域和内部作用域是嵌套的。内部作用域可以访问局部作用域的变量 y 和全局作用域的变量 x,局部作用域可以访问全局作用域的变量 x,但全局作用域不能访问局部作用域和内部作用域的变量。
总结
javascript 采用词法作用域,这使得 javascript 的作用域更加明确和可预测。词法作用域可以帮助你更好地组织代码,并避免变量命名冲突。