作用域的定义
通俗来说就是变量在JavaScript作用的范围,系统来说是:代码名字(变量)作用的范围
作用域的分类
全局作用域
作用于整个代码环境整,或者独立的js文件 作用于全局作域内的变量,成为全局变量
- 全局作用域是最大的作用域
- 在全局作用域中定义的变量可以在任何地方使用
- 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
- 这个全局作用域会一直存在,直到页面关闭才会销毁
- 代码展示
let num = 10;//我是一个全局变量
console.log(num);//10
function fun() {
console.log(num);//10
}
fun()
局部作用域
- 局部作用域是在全局作用域下开辟的一块空地
- 每一个函数内部都是一个局部作用域
- 在局部作用域下的定义的变量是局部变量,局部变量只能在局部作用域下使用
- js里面只有函数才有局部变量
- 代码展示
function fun() {
let num = 10 //我是一个局部变量
console.log(num);//10
}
console.log(num); //报错 num is not defined
块级作用域
在大括号里面声明的变量(分支和循环),只能在大括号内部使用
必须是let const声明的变量
代码展示:
for (let i = 0;i<=5;i++){
// 我是一个块级变量
}
console.log(i);//报错 num is not defined
var 声明的变量没有块级作用域的变量的概念 代码展示:
for (var i = 0;i<=5;i++){
// 我是一个块级变量
}
console.log(i);//6
特殊情况
- 但是有一种情况,函数内部的形参可以看做是局部变量。
- 如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐。
function fn() {
num = 2 //我是一个没有被声明的变量
}
fn()
console.log(num);//2
变量的访问原则
- 函数里面是一内部个作用域,如果函数里面还有函数,那么在这个作用域里面又可以诞生一个新作用域
访问原则:在能够访问的情况下,先局部,局部没有再找全局 代码展示:
let num = 10
function fn() {
let num = 20
function fun() {
let num = 30
console.log(num)//30
}
fun()
}
fn()