1.作用域
js变量作用域: 变量可以使用的范围
js三种作用域:
(1) 全局作用域 : 页面任何地方都可以使用
全局变量 : 在大括号外面声明的变量
(2) 局部作用域 : 只能在函数大括号里面使用
(3) 块级作用域 : 只能在大括号(if和for)里面使用
//全局作用域 : 全局变量
let num = 10
//局部作用域 : 函数里面声明的变量
function fn(a){//形参也是局部
//局部变量
let age = 20
console.log(age)
}
fn(10)
//块级作用域: 在大括号里面声明的变量(分支+循环)
for(let i = 1;i<=10;i++){
//块级变量
console.log( i)
}
2.作用域链
js作用域链 : 默认情况下,js代码处于全局作用域(顶级/0级),当声明函数之后就会开辟一个局部作用域(1级), 而函数内部又可以声明一个函数(2级),以此类推就会形成作用域链。
js访问作用域链规则 : 就近原则
当你访问变量的时候,会先在当前作用域寻找声明。 有则使用当前作用域。 没有就找上级有没有声明,有则使用,无则继续往上找。一直找到最顶级0级,还没有就会报错:xxx is not defined
//0级
let num = 10
console.log(num) //10
function fn() {
//1级
let num = 20
console.log(num) //20
function fn1() {
//2级
let num = 30
console.log(num) //30
}
fn1()
}
fn()
3.匿名函数
3.1匿名函数 : 没有函数名的函数
3.2匿名函数作用 : 开辟独立作用域,解决全局变量污染
变量污染 : 全局变量名过多之后,就会导致重名风险。
具名函数(有名字的函数) : function 函数名(){}
具名函数调用语法: 函数名()
function fn(){
console.log(1111)
}
fn()
匿名函数(没有名字的函数) : function(){}
匿名函数由于没有函数名,所以不能直接调用。调用匿名函数,只有两种方式
(1)函数自调用 : (匿名函数)()
细节: 自调用语法前面不能省略分号
(2) let 函数名 = 匿名函数
;(function(){
let num = 10
console.log(num)
})()
let fn1 = function(){
console.log(666)
}
fn1()