learn icon indicating copy to clipboard operation
learn copied to clipboard

JavaScript深入之变量对象

Open yangtao2o opened this issue 4 years ago • 0 comments

前言

对于每个执行上下文,都有三个重要属性:

  • 变量对象(VO,Variable object)
  • 作用域链(Scope chain)
  • this

变量对象

变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明。

参考资料:JavaScript深入之变量对象

作用域链

在《JavaScript深入之变量对象》中讲到,当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

this

在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。 --- MDN

全局环境

无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。

函数(运行内)环境

在函数内部,this的值取决于函数被调用的方式。

  • 简单调用,默认表示全局对象,在严格模式下,如果 this 没有被执行环境(execution context)定义,那它将保持为 undefined。想把 this 的值从一个环境传到另一个,就要用 call 或者apply 方法。
  • bind,调用f.bind(someObject)会创建一个与f具有相同函数体和作用域的函数,但是在这个新函数中,this将永久地被绑定到了bind的第一个参数,无论这个函数是如何被调用的。
  • 箭头函数,this与封闭词法环境的this保持一致。
  • 当函数作为对象里的方法被调用时,它们的 this 是调用该函数的对象。
  • 当一个函数用作构造函数时(使用new关键字),它的this被绑定到正在构造的新对象。
  • 当函数被用作事件处理函数时,它的this指向触发事件的元素。
  • 当代码被内联on-event 处理函数调用时,它的this指向监听器所在的DOM元素。

yangtao2o avatar Mar 06 '20 07:03 yangtao2o