作用域
1.作用域概述
代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性且减少命名冲突。
js的作用域(es6)之前:全局作用域,局部作用域。
- 全局作用域:整个script标签,或者是一个单独的js文件
- 局部作用域(函数作用域):在函数内部就是局部作用域,即,这个代码的名字只在函数内部起效果和作用
2.变量的作用域
根据作用域的不同,变量分为全局变量和局部变量。
- 全局变量:在全局作用域下的变量,在全局下都可以使用
注意:如果在函数内部,没有声明,直接赋值的变量,也是全局变量(不建议使用!) - 局部变量:在局部作用域下的变量,在函数内部的变量就是局部变量
注意:函数的形参也可以看做的局部变量
从执行效率来看,
(1)全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
(2)局部变量,当程序执行完毕就会销毁,比较节约内存资源
3.作用域链
内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构称为作用域链,就近原则。
// 案例1:结果是几?
function f1() {
var num = 123;
function f2() {
console.log(num); // 结果是123。站在目标出发,一层一层往外查找。
}
f2();
}
var num = 456;
f1();
预解析
1.预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码时分为两步:预解析和代码执行。
js引擎运行js 分为两步:
(1)预解析,js引擎会把js里面所有的var还有function提升到当前作用域的最前面
(2)代码执行,按照代码书写的顺序从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升就是把所有的变量声明提升到当前作用域的最前面,不提升赋值操作