浅谈JavaScript函数中this的指向

JavaScript开发中,函数是应用程序中的基础功能块,它们非常强大,然而函数中this的指向问题是一件让人很头疼的事情,以下从4个事例Demo中分别解释this的指向。

1.setTimeout 中的this

let timeout = setTimeout(function(){
    console.log(this); //  window对象
})

let timeout = setTimeout(() => {
    console.log(this); //  window对象
})

2.普通函数中的this

function Demo() {
    console.log(this) // window对象
}

Demo()

// 下面为严格模式
'use strict';
function Demo1() {
    console.log(this) // undefined
}
Demo1()

var star = {
    name: '蔡徐坤',
    greeting: function() {
        console.log('大家好,我是', this.name)    
    },
    master : {
        name: '蔡蔡',
        greeting: function() {
            console.log('hello everyone,我是', this.name)
        }
    }
}

var star2 = {
    name: 'summer'
}

star.greeting(); // star对象
star.master.greeting(); // master对象

var specialGreeting = star.greeting;
specialGreeting(); // window对象

star.greeting.call(star2); // 大家好,我是summer
star.master.greeting.call(star2); // hello everyone, 我是summer

var specialGreeting = star.greeting.bind(star2);
specialGreeting(); // 大家好,我是summer

3.箭头函数中的this

var star = {
    name: '蔡徐坤',
    favorties: ['篮球','唱跳','rap'],
    greeting: function() {
        this.favorties.forEach(item => {
            console.log(this) // star对象
            console.log(item) // 篮球 唱跳 rap
        })
    }
}

star.greeting();
var star = {
    name: '蔡徐坤',
    favorties: ['篮球','唱跳','rap'],
    greeting: function() {
        this.favorties.forEach(function(item) {
            console.log(this) // star对象
            console.log(item) // 篮球 唱跳 rap
        },this)
    }
}
// 上面通过传入this的方式等同于箭头函数

// 下面为普通函数不传入this,则指向全局对象window
var star = {
    name: '蔡徐坤',
    favorties: ['篮球','唱跳','rap'],
    greeting: function() {
        this.favorties.forEach(function(item) {
            console.log(this) // window
            console.log(item) // 篮球 唱跳 rap
        })
    }
}


star.greeting();

4.new里面的this

function Star(name) {
    this.name = name;
    this.greeting = function() {
        console.log('我是',this.name)
    }
}

var superStar = new Star('王子文');
console.log(superStar); // Star函数对象
superStar.greeting();// 我是王子文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值