作用域
1.作用域
就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名的冲突
2.作用域分类
2.1全局作用域:整个script标签或者是一个单独JS文件
注意:全局作用域中会给我们提前准备好的对象(一种数据格式)Windows,我们创建的全局变量会被自动添加到window对象中
var num=10
2.2局部作用域(函数作用域):在函数内部就是局部作用域,这个代码的名字,只在函数内部起作用
function fn(){
//局部作用域
var num=20
console.log(num)
}
fn()
变量的作用域
分为全局变量/局部变量
全局变量
1.在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)
2.全局变量在代码的任何位置都可以使用
3.在全局作用域下Var声明的变量是全局变量
4.特殊情况下,在函数内不使用VAR声明的变量也是全局变量(不建议使用)
var num=10//num就是全局变量
局部变量
1.在局部作用域下声明的变量,(在函数内部定义的变量)
2.局部变量只能在该函数内部使用
3.在函数内部var声明的变量是局部变量
4.函数的形参实际上就是局部变量
function fn(){
console.log(num)
}
fn()
全局与局部变量区别
1.全局变量,在任何一个地方都可以使用,只有浏览器关闭的时候才会销毁,比较占内存资源
2.局部变量,只能在函数内部使用,当其所在的代码块被执行时,会被初始化,当代码块运行结束后,就会销毁,因此更节省内存空间
一个小点了解JS没有块级作用域(现阶段没有)
JS也是在es6的时候新增的块级作用域
块级作用域{} if{} for{}
java
作用域链
只要是代码,就至少有一个作用域
写在函数内部的局部作用域
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
根据内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
简化意义:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链,就近原则
作用域链赋值规则
在给变量赋值的时候,首先会去当前作用域查找,如果有直接赋值并停止查找
如果没有,会去自己的父级查找,在父级找到直接修改然后停止查找,如果没有继续向自己的父级查找,直到找到全局作用域
在全局作用域内,找到直接赋值修改他的值,如果没有找到, 那么会在全局作用域创建一个变量, 并赋值
预解析
1:我们JS引擎运行JS分为两步:预解析/代码执行
1.1:预解析:JS引擎会把JS里面所有的Var还有function提升到当前作用域的最前面
1.2:代码执行:按照代码书写的顺序从上往下执行
2:预解析分为:变量预解析(变量提升)和函数预解析(函数提升)
2.1:变量提升就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作
//举例子1
console.log(num)//结果是undefined
var num=10
//相当于执行了以下代码
var num;//变量声明提升到当前作用域的最前面
console.log(num);
num=10
//举例子2
fun()//报错
var fun=function(){
console.log(22)
}
//相当于执行以下代码
var fun;//变量提升,变量声明提升到当前作用域的最前面
fun()//上面没有函数不能调用函数
fun=function(){
console.log(22)
}
2.2函数提升:就是把所有的函数声明提升到当前作用域的最前面
fn()
function fn(){
console.log(22)
}
//相当于执行了以下代码
function fn(){
console.log(22)
}//函数提升了
fn()