Js中的作用域和作用域链
前言
-
阅读本文,请先阅读:Js中的函数相关:创建函数的三种方式、函数的形参和实参、返回值、return、break、continue的区别、重载和arguments、匿名函数、回调函数
-
阅读本文,请千万不要阅读:Js中面向对象的三大特点:封装、继承、多态
1. 作用域
1.1 定义:
作用域是一个变量的可用范围,作用域的本质是一个保存变量的对象,作用域避免了不同范围内的数据的相互干扰。
1.2. Js中的作用域分为2级:
(1). 全局作用域:window对象
i. 专门保存所有全局变量的对象。
ii. 优点:随处可用,可以反复使用。
iii. 缺点:极易被污染。
(2). 函数作用域:函数作用域对象
i.专门保存函数内可用的局部变量的作用域。
ii. 优点:因为仅函数内可用,所以不会被污染。
iii. 缺点:不可以重复使用。
1.3函数的生命周期
一个函数从创建到调用,最后调用完所经历的阶段就是一个函数的生命周期。
(1). 定义函数时
i. 创建函数对象
ii. 创建函数名变量,保存函数的地址
iii. 每一个函数都有一个与之关联的对象列表或者链表,这个列表有两级
a. 离函数近的一级,暂时空着
b. 离函数远的一级,保存window对象的引用
函数在将来调用时,万一缺少变量,从window中查找变量使用。
(2). 调用函数时
i. 临时创建本次函数调用的函数作用域对象。
ii. 在函数作用域对象中创建本次函数所需的所有局部变量。
a. 在函数内var 出的变量是局部变量。
b.形参变量虽然没有var,但是也属于局部变量。
iii. 函数中离自己近的一级作用域列表,会立刻引用函数作用域对象。
iiii. 函数执行过程,变量的使用顺序:
a. 先局部,
b. 局部没有,才全局。
(3). 函数调用后
i. 释放函数作用域对象。
ii. 导致函数作用于对象中的局部变量也跟着释放 。
iii. 所以局部变量都不可重用。
1.4. 作用域链
i. 作用域链是由多级作用域串联形成的链式结构
ii. 每个函数在创建时,就有了自己的作用域链,
普通函数的作用域链包含两级,
离自己近的一级,暂时为空,调用函数时,用来临时引用函数作用域对象。
离自己远的一级,始终保存着全局作用域对象window
iii. 作用域链保存着一个函数可用的全部变量
iiii.控制着变量的使用顺序:先局部,局部没有,才全局
1.5. Js中没有块级作用域
i. 除函数以外的循环和分支的{},称为程序块
ii. Java语言中循环和分支结构的{}也是一级作用域,循环和分支结构内var的变量,出了{},不能使用。
iii. Js语言中循环和分支结构的{}不是作用域,循环和分支结构内var的变量,出了{},仍然可以使用。