目录
前言
今天分享的作用域相关是es6之前的js作用域分为:全局作用域和局部作用域
一、什么是作用域
作用域:代码名字(某个变量)在某个范围内起作用和效果
二、作用域目的是什么?
目的:为了提高程序的可靠性,减少命名冲突
三、全局作用域和局部作用域区别
全局作用域:script标签中、或者是一个单独的js文件
局部作用域:指的是代码名字只在函数内部起效果和作用
四、什么是变量作用域?
变量作用域:根据作用域的不同,分为全局变量和局部变量
1. 全局变量:
1、全局作用域下直接声明的变量
2、在函数内部没有声明直接赋值的变量
2.局部变量:
1、函数内部的变量就是局部变量
1、函数的形参也可以看作是局部变量
注意区别:
全局变量只有在浏览器关闭的时候才会销毁,比较占内存
局部变量当程序执行完毕后就会销毁,比较节约内存。
五、块级作用域:es6新增
比如:{} if{} for {}
六、作用域链
内部函数访问外部函数的变量, 采取链式查找的方式来决定取哪一个值, 这种结构称之为作用域链。 就近原则
var num = 10;
function fn() { // 外部函数
var num = 20;
function fum() { // 内部函数
console.log(num); //20
}
fum();
}
fn();
七、预解析
js代码是由浏览器中的js解析器(js引擎)来执行的,js引擎在运行js代码的时候分为两步:预解析和代码执行
预解析:js引擎会把js里所有的var 和 function 提升到当前作用域的最前面
代码执行:从上往下依次执行
预解析分为:变量预解析(变量提升)和函数预解析(函数提升)
变量提升:把所有变量提升到当前作用域的最前面,但不提升赋值操作
函数提升:把所有函数提升到当前作用域的最前面,但不提升函数调用
案例1
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
// 相当于执行了以下代码
var num;
function fun() {
var num;
console.log(num); // undefined
num = 20;
}
num = 10;
fun();
2、案例2
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9; //相当于 var a = 9;b=9;c=9 而集体声明:var a = 9,b=9,c=9
console.log(a);
console.log(b);
console.log(c);
}
//相当于执行了以下代码
function f1() {
var a;
a = 9;
b = 9; // 函数里面的变量直接负责,没有定义则被看作是全局变量
c = 9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(c); //9
console.log(b); //9
console.log(a); // a is not defined 报错