作用域
1 --- 变量能够被访问的‘区域’,在这个区域外便不会被访问到
2 --- 作用域分为全局作用域和局部作用域
全局作用域
在标签<script>中和,js文件的区域就是全局作用域,在此声明的变量可以被其作用域下的函数内部访问到
代码示范:

输出结果:

提示:函数内未声明的变量为全局变量,但是不推荐使用。尽量先声明变量再使用
局部作用域
局部作用域分为函数作用域和块级作用域
函数作用域
在函数中声明的变量外界无法访问到,只能函数内部访问
代码:
function foo(){
let a = 4
console.log(a) // 结果:4
}
foo()
comsole.log(a) // 报错未定义
总结:
1.函数内部声明的变量,外界无法被访问
2.函数的参数也是函数内部的局部变量
3.不同函数之间无法调用对方的变量
4.函数执行完毕,函数内部变量就会被清空,再次调用函数时会被创建
块级作用域
在 js(javaScript简称){} 花括号包围的区域就是代码块,也是块级作用域,内部变量将有可能被访问
{
let arr = [1,2,3]
console.log(arr) // 输出[1,2,3]
}
console.log(arr) // arr is not defined(未定义)
总结:
1-- let声明的变量会形成块级作用域,var不会,推荐使用let
2 -- const声明的变量会形成块级作用域
3 -- 不同块级作用域之间的变量无法访问
内部变量将有可能被访问:闭包
作用域链
函数内部允许创建新的函数,新的函数会产生新的作用域,这样的嵌套作用域形成了链状的结果所以叫作用域链
在函数被执行时,会优先查找当前函数作用域中查找变量,如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
function foo(){
let a = 2
console.log(a)
console.log(b) // 报错
function g(){
let b = 5
console.log(a) // 2
console.log(b) // 5
}
g()
}
console.log(a)// 报错
console.log(b) // 报错
foo()
闭包
闭包是一种特殊的函数,闭包能够访问函数作用域中的变量
function foo(){
let a = 2
function g(){
console.log(a+1) // 输出3
}
return g()
}
foo()
总结:
1.闭包是一种函数,不过是从函数内部返回
2.闭包可以创建外部访问的隔离作用域,避免全局变量污染
3.但是闭包可能造成内存泄漏
变量提升
变量提升是javascript中特殊的现象,允许变量在sheng声明前被访问,出现在同一作用域
变量在未声明时即被访问会报错
变量在声明前被调用时,变量值为undefined,工作中推荐先声明再调用
let不存在变量提升所以推荐使用let声明变量
网友评论