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 方法可以用来代替另一个对象调用一个方法。