前端js基础之作用域和作用域链

179 阅读2分钟

作用域

作用域的分类

1.全局作用域 2.函数作用域

作用域的定义

作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。

作用域的作用

防止不同范围的变量之间相互干扰

全局作用域

不属于任何函数的外部范围称为全局作用域 全局变量 定义:保存在全局作用域的变量 优点:可反复使用。 缺点:全局污染(开发时禁止使用)。

函数作用域

一个函数内的范围称为函数作用域。 局部变量 定义:保存在函数作用域的变量(::形参变量也是函数内的局部量::)。 优点:不会被污染。 缺点:无法反复使用。

注意: 只有函数的{}才能形成作用域。 不是所有的{}都能形成作用域;也不是所有的{}内的变量都能是局部变量。

  • 对象的{}就不是作用域
  • 对象中的属性也不是局部变量

作用域链

因为,js规定,一个函数,既能用自己作用域的变量,又能用外层作用域的变量。所以,需要一个“路线图”告诉每个函数,自己都可以去哪里找到想用的变量。就像生活中我们规划旅游景点的游览路线一样。 一个函数可用的所有作用域串联起来,就行成了当前函数的作用域链。(本质上是一个对象)

总结:

作用域和作用域链本质上都是对象结构。 全局作用域其实是一个名为window的对象,所有全局变量和全局函数都是window对象的成员。 函数作用域其实是JS引擎在调用函数时才临时创建的一个作用域对象,用来保存函数的局部变量,而函数调用完,函数作用域对象就释放了。

最后

函数的调用过程VS做饭三部曲

  • 第一步:厨师准备食材(创建函数作用域对象保存局部变量)
  • 第二步:厨师按所学菜谱上的步骤做菜(js按函数体规定的步骤执行每一项操作)
  • 第三步:收拾厨房保持干净整洁(js会在函数调用后自动释放临时创建的函数作用域对象)

下一节:前端JS基础之闭包