Js中的作用域和作用域链

Js中的作用域和作用域链

前言

  1. 阅读本文,请先阅读:Js中的函数相关:创建函数的三种方式、函数的形参和实参、返回值、return、break、continue的区别、重载和arguments、匿名函数、回调函数

  2. 阅读本文,请千万不要阅读: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. 所以局部变量都不可重用。

Js中的作用域和作用域链_第1张图片

1.4. 作用域链

i. 作用域链是由多级作用域串联形成的链式结构

ii. 每个函数在创建时,就有了自己的作用域链,

普通函数的作用域链包含两级,

离自己近的一级,暂时为空,调用函数时,用来临时引用函数作用域对象。

离自己远的一级,始终保存着全局作用域对象window

iii. 作用域链保存着一个函数可用的全部变量

iiii.控制着变量的使用顺序:先局部,局部没有,才全局

1.5. Js中没有块级作用域

i. 除函数以外的循环和分支的{},称为程序块

ii. Java语言中循环和分支结构的{}也是一级作用域,循环和分支结构内var的变量,出了{},不能使用。

iii. Js语言中循环和分支结构的{}不是作用域,循环和分支结构内var的变量,出了{},仍然可以使用。

你可能感兴趣的:(作用域,作用域链,变量,javascript)