2022.3.22 学习笔记
目录
三、JavaScript作用域
3.1 作用域
3.1.1 作用域概述
通常来说,一段程序中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域:整个scrip标签或者一个单独的js文件
局部作用域(函数作用域):在函数内部就是局部作用域,这个代码的名字只在函数内部起效果和作用
var num =10;
console.log(num);
function fn(){
var num=20;
console.log(num);
}
fn();
3.2 变量的作用域
3.2.1 变量作用域的分类
在JavaScript中,根据作用域的不同,变量可以分为全局变量和局部变量两种。
1.全局变量
在全局都可以使用;在全局作用域下var声明的变量是全局变量
2.局部变量
只能在函数内部使用;在函数内部var声明的变量是局部变量
注意:函数的形参实际上是局部变量;在函数内部没有声明、直接赋值的变量属于全局变量。
3.从执行效率来看:
全局变量只有浏览器关闭的时候才会销毁,比较占内存资源;
局部变量当其所在的代码块被执行时会被初始化;当代码块运行结束后才会销毁,比较节约内存资源。
3.3 作用域链
1.只要是代码,就至少有一个作用域;
2.写在函数内部的局部作用域;
3.如果函数中还有函数,那么这个作用域中就又可以诞生一个新的作用域;
4.根据在内部函数可以访问外部函数变量这种机制,用链式查找决定哪些数据可以被内部函数访问,就称作作用域链。(就近原则:站在目标出发,一层一层向外查找)
四、JavaScript预解析
4.1 预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。
预解析:JS引擎会把JS里面所有的var以及function声明提升到当前作用域的最前面
代码执行:按照代码书写的顺序从上往下执行
4.2 变量预解析和函数预解析
预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)。
变量提升:把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
例1:console.log(num);
var num=10; // 输出undefined
上面这段代码相当于执行了一下代码:
var num;
console.log(num);
num=10; // 所以输出了undefined
例2:fn(); //程序报错
var fn = function () {
console.log(10);
}
上面这段代码相当于执行了一下代码:
var fn;
fn();
fn = function () {
console.log(10);
} // 所以程序报错。因此函数表达式声明函数时,调用函数需要写在代码段之后。
函数提升:把所有的函数声明提升到当前作用域的最前面,不调用函数
例3:fn();
function fn() {
console.log(10);
} //输出10
上面这段代码相当于执行了一下代码:
function fn() {
console.log(10);
}
fn(); //输出10
4.3 预解析案例
案例1:结果为undefined
![]()
案例2:结果为undefined,20
![]()
![]()
案例3:结果为undefined,9
![]()
案例4: 结果为9,9,9,9,9,报错
![]()