美文网首页
作用域链

作用域链

作者: jump_go | 来源:发表于2018-05-13 23:22 被阅读0次

作用域链

当函数被执行,便进入了自己的执行上下文,
该执行上下文中的变量若并没有被找到,
就会往上一层的作用域中去查找。
直到该作用域的顶层(一般为全局环境中)

JS权威指南中有一句很精辟的描述: ”JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.”

由上可知,作用域链的规则确定,是函数在哪里声明在地方,而非被执行的作用域中。
可以将此过程理解为,js引擎在解析js代码的时候就确定了函数的作用域链规则,而非是执行时产生的执行上下文而确定的作用域链。

函数被声明时

当函数被声明的时候,其函数内部有一个[[scope]]的属性,里面保存了该父作用域链级规则。

函数声明和执行的过程

以下为例

var scope = "global scope";
function checkscope(){
    var scope2 = 'local scope';
    return scope2;
}
checkscope();
  1. checkscope函数被创建时,作用域链相关规则被保存到内部属性[[scope]]中
checkscope.[[scope]] = [
    globalContext.VO
];
  1. 执行checkscope函数,checkscope函数创建上下文(checkscopeContext)。checkscopeContext被push进执行上下文栈中,以便执行代码。

  2. checkscope函数并不马上执行,而是初始化活动对象,加入形参、函数声明、变量声明,复制作用域链并将活动对象压入 checkscope 作用域链顶端

checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: undefined
    },
    Scope: checkscope.[[scope]],
}

将活动对象压入 checkscope 作用域链顶端

checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: undefined
    },
    Scope: [AO, [[Scope]]]
}
  1. 始执行函数,随着函数的执行,修改 AO(变量对象) 的属性值
checkscopeContext = {
    AO: {
        arguments: {
            length: 0
        },
        scope2: 'local scope'
    },
    Scope: [AO, [[Scope]]]
}
  1. 执行完函数,并从执行上下文栈中弹出。

作用域和执行上下文

  • 作用域规定了函数内部变量,和内部函数的可访问范围。js没有块级作用域,当生命一个函数的时候,就产生了一个局部作用域。是一套规则
  • 而执行上下文是,当函数在执行的时候,不仅仅是作用域和作用域链的访问规则。而是包括活动变量,形参等等的AO的环境。
作用域链的规则,是当该函数在执行的时候,在自己本身的AO(变量对象)中找不到该变量,便遵循作用域链的规则往父作用域(该函数声明的地方就是其父作用域)中AO中寻找,该作用域链寻找一直到全局作用域中。

相关文章

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • 作用域链

    作用域链 把多个作用域串起来便形成了作用域链;每个函数在初始化完成之后就拥有了各自的作用域链,但此时的作用域链中并...

  • web性能实践

    一. 作用域 前面我们了解作用域概念的以及作用域链是如何运作的。 随着作用域链中的作用域数量的增加,访问当前作用域...

  • JS_0: 执行环境和作用域链

    JavaScript,目前对于执行环境和作用域链的理解 什么是作用域链? 要讲作用域链就得先讲执行环境。 每个函数...

  • js 总结七07-19

    作用域 全局 局部 作用域链 闭包

  • 作用域和闭包

    作用域链 (据我所知)所有的编程语言都存在作用域链。整个代码存在全局作用域、函数作用以及块级作用域。 上述代码将会...

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • JavaScript 作用域链与闭包

    作用域链与闭包 了解作用域链之前需要先了解下作用域是什么。 作用域 几乎所有的语言都有作用域的概念。这是因为它们都...

  • 作用域/作用域链 闭包及其使用

    一、作用域、作用域链 作用域(scope) 浅显的理解: 作用域就是变量的可用范围(scope) 为什么要有作用域...

  • 作用域链

    作用域链(scope chain) 理解: 作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被...

网友评论

      本文标题:作用域链

      本文链接:https://www.haomeiwen.com/subject/mfvrdftx.html