前端技术专家面试-作用域&作用域链

99 阅读2分钟

一、作用域

  1. javascript采用 词法用域
    • 写代码的时候已经确定了能访问到什么变量。
    • 作用域可以嵌套。这意味着我们可以在一个作用域内部创建另一个作用域。
    • 内部作用域可以访问外部作用域的变量,外部作用域无法访问内部作用域的变量。
  2. javascript中的词法用域细分为:全局作用域、模块作用域、函数作用域、块作用域。
  3. 进入作用域的起始点创建作用域,离开作用域的时候销毁作用域,闭包情况下例外。

二、作用域链

由于作用域的嵌套,就形成了作用域链

作用域链是JavaScript引擎查找变量时所遵循的结构。当访问一个变量时,JavaScript会:

  1. 首先在当前作用域中查找该变量。
  2. 如果没找到,就会向上一级作用域查找。
  3. 这个过程会一直持续到全局作用域。
  4. 如果在全局作用域中也没找到,则会抛出ReferenceError。

三、闭包

背景1:javascript采用词法用域,函数初始化的时候,有一个作用域链,函数内部可以访问这个作用链域。

背景2:javascript的函数可以作为参数返回和传递,也就是说函数调用的时候已经不在原来的作用域链内;这个 时候原来的作用域链应该被销毁,但是销毁了函数就无法访问了。

基于以上两个背景:就产生了闭包,来保存函数初始化时候的作用域。

闭包:使得该函数可以访问其被创建时所在作用域的变量,即使在该函数在其原始作用域之外被调用时也能访问这些变量。

四、with语句可以改变作用域(不推荐使用)

with 语句可以临时扩展作用域链。它将一个对象添加到作用域链的前端。

let obj = {x: 1, y: 2};
with(obj) {
  console.log(x); // 1
}

五、var let const

  1. 三者的作用域不同let const有块级别作用域,var没有。
  2. 代码在执行的时候
    1. 相同点:在作用域内,三者生命的变量都会提升。
    2. 不同点:var可以被访问,let const有访问锁死区,出了锁死区域才能访问。