关于this指向的总结

分析下面的代码指向,注意都是在非严格模式下面的指向

function foo(){
  console.log(this)
}
foo()
foo.call(1)
  • 如果是在浏览器环境下调用,指向全局对象window,
  • 如果在node环境下调用,指向 globalThis
  • 上面call,bind,apply这种方式,指向的是1
const obj1 = {
  foo: function(){
    console.log(this)
  }
}
obj1.foo() // => obj1
const fn = obj1.foo
fn() // => window
const obj2 = {
  foo: function(){
    function bar() {
      console.log(this)
    }
    bar()
  }
}
obj2.foo() // => window

关于this 的总结

  • 沿着作用域向上找最近的一个function(不是箭头函数),看这个function 最终是怎么执行的
  • this的指向取决于所属function的调用方式,而不是定义方式
  • function 调用一般分为几种情况:
    1. 作为函数调用,即为 foo()
      • 这种情况指向全局对象,注意严格模式问题,严格模式下是undefined
    2. 作为方法调用,即为foo.bar() /foo.bar.baz()/ foo['bar']/ foo[0]()
      • 这种情况指向调用这个方法的对象
    3. 作为构造函数调用,即:new Foo()
      • 这种情况最终指向一个新对象Foo {}
    4. 特殊调用, 即: foo.call()/ foo.apply()/ foo.bind()
      • 指向参数指定的成员
  • 如果找不到所属function,就是全局对象
    例如 在函数最外层直接 cosole.log(this)

Node.js环境

  • 由于文件代码中最顶层作用域实际上是一个伪全局环境,所以最顶层的this并不指向全局对象

严格模式下原本指向全局的 this 都会指向undefined

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JavaScript 中的 new、bind、call、apply 实际这些都离不开 this,因此本文将着重讨论...
    金色888阅读 1,410评论 0 0
  • this的指向 全局作用域 无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。 ...
    locky丶阅读 1,722评论 0 1
  • 一、this是什么? this是指包含它的函数作为方法被调用时所属的对象。 二、由new调用(new绑定),绑定到...
    niduyi52阅读 1,677评论 0 0
  • 1.概念 在JavaScript中,this 是指当前函数中正在执行的上下文环境,因为这门语言拥有四种不同的函数调...
    BluesCurry阅读 4,868评论 0 2
  • 浅谈javascript中this的指向 调用位置 在理解this的绑定过程之前,首先要理解调用位置。调用位置就是...
    蒹葭de阅读 2,256评论 0 1