call方法的指向性问题及其理解

function returnWeekday() {
    let string = "今天是星期";
	let date = new Date().getDay();
	// 使用对象
	let dateObj = {
		0: ['天', '休'],
		1: ["一", '工'],
		2: ["二", '工'],
		3: ["三", '工'],
		4: ["四", '工'],
		5: ["五", '工'],
		6: ["六", '休'],
	}
	// 类型,这里也可以对应相关方法
	let dayType = {
	    '休': function() {
		     // some code
			console.log('为休息日')
	},
	    '工': function() {
			// some code
			console.log('为工作日')
			return '为工作日'
		}
	}
	let returnData = {
		'string': string + dateObj[date][0],
		'method': dayType[dateObj[date][1]]
	}
	return returnData
};
console.log(returnWeekday().method.call(this))

上面的代码段是从vue中文社区公众号中的一篇优化if-else文章中拿过来的
文字地址:https://mp.weixin.qq.com/s/si7sFf-nCebbCxuCgBZPSw
上面代码中returnWeekDay方法中提供了一个告诉今天是周几以及是否为工作日的方法或者字符串

returnWeekDay().string  =》今天是星期三
那么我们想要知道今天是否为工作日就需要调用returnWeekDay().method方法,但是直接调用我们打印出来的是这样的

ƒ _() {
                // some code
                console.log('为工作日');
                return '为工作日';
              }

这样明显就不是我们想要的效果,所以:

我们加上call(this) => returnWeekDay().method.call(this)试试看:

上面看到,得到了我们需要的结果,看看call的定义:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 

 这里我们可以知道,returnWeekDay().method.call(this)中的this指向的是全局。所以可以理解为,如果没有call,那么就是单纯的调用了returnData.method这个属性,而method里面是一个方法:

function() {
						// some code
						console.log('为工作日')
						return '为工作日'
					}

所以这就可以解释不加call的话,打印出来的是一个方法,因为我们没有调用method

returnWeekDay().method.call(this)我们是使用全局的this去调用method这个函数。所以最终的结果我们可以得到“今天为工作日”

最后,我们要记住一句话:call 方法可以用来代替另一个对象调用一个方法。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值