在 JavaScript 中 , 任何代码都有 作用域 ,
<script>
标签中 或者 js 脚本中 定义的变量 属于 全局作用域 ;{}
代码块 中 使用 let / const 定义的 常量 / 变量 属于 块作用域 ;{}
代码块 中定义的变量 , 取决于 代码块位置 , 代码块在全局作用域 则 该变量属于全局作用域 , 代码块在 局部作用域 则该变量属于 局部作用域 ;如果在 函数 的 局部作用域 中 , 又定义了一个 函数 , 则诞生了一个新的 局部作用域 ;
作用域链 概念 : 在 内部函数 访问 外部函数的变量 或 全局变量 , 此时 需要 使用 链式查找 的方法 , 确定取哪个值 , 这种作用域结构 称为 " 作用域链 " ;
作用域链 是 JavaScript 的重要的概念 , 用于 查找 变量名 对应的 不同作用域的 变量 ;
当 JavaScript 代码 执行时 , 会创建变量对象的 作用域链 , 其用途是保证对执行环境有权访问的所有变量和函数的有序访问 ;
在 JavaScript 代码中 的 嵌套作用域 中 , 查找 变量 或 函数 的 机制就是 作用域链 的 链式查找机制 ;
内部函数 在 访问 指定名称的 变量时 , 采取的是 链式查找方式 ;
在下面的代码中 :
首先 , 在 全局作用域 中定义 num 变量 , 该变量的 作用域 属于 全局作用域 ;
然后 , 定义外部函数 , 在 全局作用域 中 定义 out_fun 函数 , 在 该函数的 范围内 是 局部作用域 ;
最后 , 定义内部函数 , 在 out 函数中 , 定义了 in_fun 函数 , 在 局部作用域 中 又 诞生了一个新的 局部作用域 ;
在 全局作用域 , 内部函数 , 外部函数 , 都定义一个 num 变量 ,
完整代码示例 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!-- 设置 meta 视口标签 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>JavaScript</title>
<style></style>
<script>
// 作用域链
// 全局作用域 变量
var num = 333;
function out_fun() {
// 外部函数 局部作用域 变量
var num = 666;
function in_fun() {
// 内部函数 局部作用域 变量
var num = 999;
// 打印查找的 num 变量
console.log("in_fun : num = " + num)
}
// 调用内部函数
in_fun();
// 打印查找的 num 变量
console.log("out_fun : num = " + num)
}
// 打印查找的 num 变量
console.log("global : num = " + num)
// 调用外部函数
out_fun()
</script>
</head>
<body>
</body>
</html>
执行结果 :