learn
learn copied to clipboard
JavaScript深入之变量对象
前言
对于每个执行上下文,都有三个重要属性:
- 变量对象(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元素。