js中的作用域指的就是变量的可作用范围,变量只在自己的作用域下生效,函数会产生作用域,函数内定义的变量只能在函数内使用,外层作用域无法访问函数内部变量. js中的作用于分为:
全局作用域:
在函数外面定义的变量的作用域就是全局作用域,全局变量在哪里都可以访问.
局部作用域:
在函数内定义的变量和形参的作用域就是局部作用域,这样的变量称为局部变量.
块级作用域:
在代码块中使用es6新增的let和const定义的变量的作用域就是块级作用域,这样的变量称之为块级变量
堆栈了解
栈内存主要是用来存放值类型的数据,函数的执行也会在这里面执行,函数执行会创造私有执行上下文.
,函数的执行会在栈内存中开辟私有执行上下文EC(function),私有上下文中的AO用来存储函数中的私有变量和形参,而EC(g)中的vo中存储的是使用let和const声明的全局变量,在es6之前使用var关键字声明,会放在window全局对象当中.
函数的作用域在函数定义的那一刻就注定了,其作用域只和在哪里定义有关,和在哪里调用无关.
var a = 100; //var 声明的全局作用域变量 会挂在window上+
let b = 20; // let const 声明的全局作用域变量 不会挂在window上
function fn() {
let a = 99;
n = 66;
var bb = 88;
function Fn() {
let a = 30; //1.隔离变量 不同作用域的变量名可以相等
//函数 的嵌套函数 可以访问上层变量 函数内的嵌套函数与外层函数不在同一执行上下文
console.log(a, '当前作用域的变量', b, '全局变量', n, '上层作用域不通过关键字声明变量', bb, '当前内部嵌套变量--上层作用域变量');
}
}
fn()
在函数内不通过关键字直接给未声明变量赋值也会被挂在window,是一个全局变量
var a = 1; //此处的a为全局变量
function fn() {
let b = 2; //此处的b为局部变量,外部不可访问
function fn2() {
console.log(a + b);//这里的a是全局变量,b是局部变量
};
fn2();
};
fn();
作用域链
1.函数会限制变量的作用域范围,而函数内是可以嵌套函数的,函数的层层嵌套,就形成了作用域链
2.作用域链描述的是程序在执行过程当中寻找变量的过程
作用域链查找变量的过程
当函数使用变量时会按照如下过程去查找变量
(1)先从自身作用域去查找,如果没有就往上级作用域查找,知道查找到全局作用域当中
(2)如果其中有找到,就会停止向上查找,直接使用.
(3)如果直到全局都没有找到,则会报引用错误或变量未定义