JS this 指向问题

发布于 2024-11-24 18:14:36 字数 1903 浏览 20 评论 0

每个函数在调用时,都会去获取 2 个值: arguments 和 this

匿名函数在获取这 2 个值时,只会搜索自己执行环境中的,永远不会直接访问外部函数或执行环境中的这 2 个变量

结论

this 最终指向的是那个调用它的对象

var a = 'hello'

function foo () {
  console.log(this.a)
}

foo() // hello (可以看做 window.foo())
function foo () {
  console.log(this.a)  //谁调用了我,我就指向谁
}

var obj = {
  a: 'hello',
  foo: foo,
}
obj.foo() // hello
function foo () {
  console.log(this.a)  //谁调用了我,我就指向谁
}

var obj2 = {
  a: 'hello',
  foo: foo,
}
var obj1 = {
  a: 'world',
  obj2: obj2,
}
obj1.obj2.foo() // hello
function foo () {
  console.log(this.a)
}

var obj = {
  a: 'hello',
  foo: foo,
}
var bar = obj.foo // 函数引用传递
var a = 'Global'
bar() // "Global"

显示绑定

通过 bind(),apply(),call() 函数可以显示的绑定 this 作用域,它接收的第一个参数即是上下文对象并将其赋给 this

默认绑定全局变量 window

// 接上
var a = 'hello window'
foo.call(null) // hello window

new 新对象绑定(指向 new 出来的对象实例)

function foo(a) {
  this.a = a
}
var bar = new foo('hello')
console.log(bar.a) // hello

this 在匿名函数中

匿名函数(非箭头函数) 的执行环境具有全局性,this 通常指向 window

var flag = 'window'
var object = {
  flag: 'local',
  sayFlag: function () {
    //返回一个匿名函数
    return function () {
      console.log(this.flag)
    }
  },
}
object.sayFlag()() // window (非严格模式下)

this 在 es6 Class 中的指向

class Printer {
  printName (name = 'there') {
    this.print(`Hello ${name}`)
  }

  print (text) {
    console.log(text)
  }
}

const printer = new Printer()

const { printName } = printer
printName() // 报错

printer.printName() // Hello there

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

甜中书

暂无简介

文章
评论
28 人气
更多

推荐作者

闻呓

文章 0 评论 0

深府石板幽径

文章 0 评论 0

mabiao

文章 0 评论 0

枕花眠

文章 0 评论 0

qq_CrTt6n

文章 0 评论 0

红颜悴

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文