js作用域
在 JavaScript 中,我们将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套子作用域中根据标识符名称进行变量(变量名或者函数名)查找。
js中只有全局作用域和函数作用域。
作用域和执行上下文是两个完全不同的概念。
js代码的整个执行过程分为编译阶段和执行阶段,而在编译阶段就会确定作用域,执行上下文则是在执行阶段创建。
作用域链,是由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。
函数执行时形成私有作用域
函数执行的时候(直接目的:让函数体中的代码执行)会形成一个新的私有的作用域。供函数体中的代码执行。
因为变量要规定活动范围,为了便于管理不同范围的变量,所以就有了作用域。
function fn(){
var a=1;
}
fn();
fn();
console.log(a);//Uncaught ReferenceError: a is not defined;
上述代码中,fn运行了两次所以产生了两个堆内存,两个作用域内各自有一个a变量,但是两个a之间是没有任何关系的。就好比我们都属于人类;我们都继承了人类这个对象所具有的特征;我有一双手,你也有一双手,但是我们两个人的手是没有关系的;我的手不等于你的手。
全局变量和私有变量
- 在全局作用域下声明的变量是全局变量
- 在私有作用域中声明的变量是私有变量,函数的形参也是私有变量。
如何区分函数中出现的变量是私有的韩式非私有的?
首先看是否是形参,然后看是否在函数体内声明过,两者有其一就是私有变量,那么当前函数中不管什么位置出现都是私有的。
如何查找当前作用域的上级作用域?
当前作用域的上级作用域是谁 和函数在哪执行 没有任何关系;只看当前函数是在哪个作用域下定义的,那么它的上级作用域就是谁。
JavaScript中的代码执行顺序是从上到下逐条运行的;遇到function定义函数的代码块;直接跳过;遇到函数执行的代码;就找到引用的函数地址;开始跳到执行函数产生的作用域中执行代码;等函数执行完以后,再回到当前作用域执行下面的代码;
当函数内return一个引用数据类型;并且函数外面有一个变量接收这个引用数据类型;此时的作用域是不销毁的;
ps: 更细致的讲解可以移步大佬的文档观看,作用域和闭包
闭包:能够读取其他函数内部变量的函数。
闭包理解