前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS中的this指向问题

JS中的this指向问题

原创
作者头像
知识浅谈
发布2021-12-30 11:09:54
9410
发布2021-12-30 11:09:54
举报
文章被收录于专栏:分享学习分享学习

this指向问题

this应该是第一个让人对JavaScript困惑的问题了,但是实际上它的原理非常简单:函数的this在运行时绑定。

什么叫运行时绑定?就是函数的this和你写在哪里无关,而是和谁调用它有关。谁调用这个函数,this就指向谁。

你现在大概会在想:原来这么简单,我精通了!

那可就大错特错了,可千万别忘了光函数的调用方法就有两种:直接调和new一个,而能做这两个操作的地方可以说非常的多,所以还需要往下看。

注意:以下例子均为严格模式下运行,非严格模式这里不做考虑。

初级

代码语言:javascript
复制
function f1 () {
    console.log(this)
}

f1(); 问结果是什么?先问自己:谁调用的它?你应该一下看不出来,这明明就是直接调的啊!可能有的基础比较扎实的人会说是window,那真是非常的恭喜你了,但你要注意的是以上代码在严格模式下是undefined。

正解: window / undefined

代码语言:javascript
复制
const foo = {
    bar: 10,
    fn: function() {
       console.log(this)
       console.log(this.bar)
    }
}

let fn1 = foo.fn
fn1()

结果是什么?你可能一眼看到fn是定义在foo对象里,那this可不就是foo吗,刚刚说什么来着,先问自己:谁调用的它,来看最后一行再回答一遍。

正解:window / undefined

中级

代码语言:javascript
复制
const foo = {
    bar: 10,
    fn: function() {
       console.log(this)
       console.log(this.bar)
    }
}

foo.fn() 现在你应该已经有点感觉了,来,说出来,谁调用的它fn?

正解:foo

中级+

代码语言:javascript
复制
const person = {
    name: '橙子',
    brother: {
        name: '河浪',
        fn: function() {
            return this.name
        }
    }
}
console.log(person.brother.fn())

看能不能过关斩将,谁调用的fn?

正解:brother

call / bind / apply 此为3种干预this指向的操作,限于篇幅不展开讲。

箭头函数 箭头函数可以让你省很多事,因为它的this一般来说都是符合你的直觉的:它的this就是定义时候的this。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • this指向问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档