前言
作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域集合。换句话说,作用域决定了代码区块中变量和其他资源的可见性。作用域一般分为:
- 全局作用域
- 函数作用域
- 块级作用域
1.全局作用域
在函数外部定义的变量和函数具有全局作用域。它们在整个脚本文件或模块中都是可访问的。这意味着在全局作用域中声明的变量可以在任何地方被读取或修改。
var str= 'Hello Word'; // 全局变量
function printStr() {
console.log(str); // 可以从全局作用域访问这个变量
}
printStr(); // 输出 Hello Word
console.log(str); // 输出 Hello Word
2.函数作用域
函数作用域又称局部作用域,通常是指在函数内部声明的变量和函数的作用域。这些变量和函数只能在其所在函数内部被访问,而在函数外部是无法访问的。
function printStr() {
var str= 'Hello Word'; // 全局变量
console.log(str);
}
printStr(); // 输出:Hello Word
console.log(str) //str is not defined
3.块级作用域
自ES6引入了 let
和 const
关键字后,JavaScript开始支持真正的块级作用域。与 var
不同, 在 {}
内部用 let
或 const
声明的变量仅在该块内可用。
{
let str = 'Hello World'
console.log(str); // 输出:Hello Word
}
console.log(str); //str is not defined
4.作用域链
当使用一个变量时,JS 解释器会优先在当前作用域中寻找变量,如果找到了则直接使用。 如果未找到,则去上一层作用域寻找,以此类推,找到了则使用。如果一直到全局作用域都没有找到,则报错 xxx is not undefined
5.变量的提升
使用var
声明的变量,它会在所有代码执行前声明,将作用域提升到顶级,所以不会抛出引用错误,而是输出undefined
。
console.log(a) //undefined
var a = 11
6.函数的提升
使用函数声明创建的函数(function
),会在其他代码执行之前被创建,将函数提升到顶级,所以在函数声明之前调用也是可以正常执行的。
fn() // Hello Word
function fn(){
consoloe.log('Hello Word');
}
这里如果使用 let
或者 const
声明的函数,会报错 Cannot access 'ff' before initialization
(在初始化之前无法访问函数)。因为 const 与 let 声明的函数不会发生变量的提升。
ff() // Cannot access 'ff' before initialization
consrt ff = function (){
consoloe.log('Hello Word');
}