什么是作用域
作用域是指当前正在执行的代码能够访问到变量的范围。
常见的作用域主要分为几个类型:全局作用域、函数作用域、块状作用域、动态作用域。
对象 | 类型 |
---|---|
global window | 全局作用域 |
function | 函数作用域(局部作用域) |
{} | 块状作用域 |
this | 动态作用域 |
全局作用域
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
- 最外层函数和在最外层函数外面定义的变量拥有全局作用域
- 所有末定义直接赋值的变量自动声明为拥有全局作用域
- 所有 window 对象的属性拥有全局作用域
一般情况下,window 对象的内置属性都拥有全局作用域,例如 window.name、window.location、window.top 等等。
函数作用域
函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部
function m(){
var str = "nainyuyu";
function innerSay(){
console.log(str); // nainyuyu
}
innerSay();
}
m();
console.log(str); // Uncaught ReferenceError: str is not defined
块状作用域
块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
- 在一个函数内部
function a() {
if(true) {
let personName = "nainyuyu";
console.log(personName); //nainyuyu
}
console.log(personName); //Uncaught ReferenceError: personName is not defined
}
- 在一个代码块(由一对花括号包裹)内部
if(true){
let personName = "nainyuyu";
console.log(personName); //nainyuyu
}
console.log(personName); //Uncaught ReferenceError: personName is not defined