- 当浏览器加载HTML页面的时候,首先会提供一个供全局JS代码执行的环境 --> 全局作用域(global/window)
- 预解释(变量提声)
- 在当前的作用域中,JS代码执行之前,浏览器首先会默认地把所有带var和function的进行提前的声明或者定义
-
1)理解声明和定义
var num=12;
声明(declare):var num; //告诉浏览器在全局作用域中有一个num的变量了
定义(defined):num=12;给变量赋值
2)对于var和function关键字在预解释的时候的区别:
var:在预解释的时候只是提前地声明
function:在预解释的时候提前声明并定义,同时完成
3)预解释只会发生在当前的作用域下,一开始只对window下的做预解释,只有函数执行的时候才会对函数中的进行预解释
4)JS中内存的分类
栈内存:用来提供一个供JS代码执行的环境,也就是作用域(全局作用域/私有作用域)
堆内存:用来存储引用数据类型的值,对象存储的是属性名和属性值,函数存储的是代码字符串
-
作用域链
- 如何区分私有变量和全局变量:
1)在全局作用域下声明(预解释的时候)的变量是全局变量,
2)在私有作用域中声明的变量和函数的形参都是私有的变量
** 在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有的变量,如果是私有变量,那么和外面的变量没有任何的关系,如果不是私有的,则往当前的上级作用域进行查找,如果上级作用域没有则继续查找,一直找到window为止
- 如何区分私有变量和全局变量:
-
当函数执行的时候(直接目的:让函数体内的代码执行),首先会形成一个新的私有作用域,然后按照如下的步骤执行:
1)如果有形参,先给形参赋值
2)进行私有作用域的变量提声(预解释)
3)私有作用域中的代码从上到下 -
闭包:函数形成一个新的私有的作用域保护了里面的私有变量不受外界的干扰