除嵌套函数外,JS中还有哪些词法作用域示例?函数参数是否属词法作用域?
关于JavaScript词法作用域的常见疑问解答
词法作用域的核心本质
词法作用域的核心是:变量的可访问性由代码书写时的位置决定,而非运行时的调用位置。嵌套函数和闭包只是它最直观的表现形式,但绝非全部。
词法作用域是否仅与嵌套函数及父子作用域访问性相关?
当然不是。嵌套函数是词法作用域的典型应用场景,但它是JavaScript所有作用域规则的底层基础——全局作用域、函数作用域、块级作用域、模块作用域,全部遵循词法作用域的规则。
除嵌套函数和闭包外,JavaScript中词法作用域的其他示例
1. 全局作用域与函数作用域的交互
const globalVar = "我是全局变量"; function accessGlobal() { console.log(globalVar); // 能访问,因为函数写在全局作用域内 } accessGlobal(); // 输出:我是全局变量
这里函数accessGlobal能访问全局变量globalVar,就是因为词法作用域规则:函数定义时处于全局作用域,因此可以访问该作用域内的变量。
2. 块级作用域(let/const)
if (true) { let blockVar = "我是块级变量"; console.log(blockVar); // 正常访问 } console.log(blockVar); // 报错:blockVar is not defined
let/const声明的变量属于块级作用域,其作用范围由代码中{}块的书写位置决定,外部无法访问,这完全符合词法作用域的规则。
3. ES模块作用域
在ES模块中,未导出的变量默认仅在模块内部可访问:
// moduleA.js const modulePrivateVar = "模块私有变量"; export function logVar() { console.log(modulePrivateVar); // 能访问,因为函数和变量在同一模块内 } // moduleB.js import { logVar } from './moduleA.js'; logVar(); // 输出:模块私有变量 console.log(modulePrivateVar); // 报错:modulePrivateVar is not defined
模块内部的变量作用范围由其在模块中的书写位置决定,外部模块无法直接访问未导出的变量,这也是词法作用域的延伸。
函数参数是否构成词法作用域?
是的。函数参数属于函数作用域的一部分,而函数作用域本身就是词法作用域的体现。以你给出的代码为例:
function greet(name) { console.log("Hello, " + name + "!"); // 能访问name,因为它是函数的参数,属于函数内部作用域 } greet("Alice"); // 输出:"Hello, Alice!" console.log(name); // 报错:name is not defined
参数name的作用范围由函数定义时的位置决定——仅在greet函数内部可访问,外部无法获取,这完全符合词法作用域的核心规则。
内容的提问来源于stack exchange,提问作者a Learner
相关产品推荐
相关产品推荐

