【发布时间】:2018-09-04 11:46:51
【问题描述】:
我正在学习针对初学者的在线课程,该课程使用 apply/bind 方法为函数设置“this”上下文。
我看到您可以将绑定方法直接链接到功能块,这对我来说是新的。所以这让我开始思考为什么我不能链接除绑定/调用/应用之外的其他方法来影响返回值。
let obj = {
name: 'john',
};
let sayHello = function() {
return 'hello there ' + this.name;
}.apply(obj).toUpperCase();
let sayBonjour = function() {
return 'Bonjour!';
}.toUpperCase();
console.log(sayHello);
console.log(sayBonjour());
在上面的示例中,为什么我可以在使用 apply 方法的 sayHello 函数上使用 .toUpperCase() 方法,而不是在不使用 apply 方法的 sayBonjour 函数上。在尝试这样做时,我得到了错误:
'Uncaught TypeError: (intermediate value).toUpperCase is not a function'.
我意识到这不是字符串方法(或其他方法)的使用方式,出于学习目的,我希望有人能解释是什么阻止我以这种方式使用该方法。
非常感谢您的时间和帮助
【问题讨论】:
-
之所以可以使用
bind、call和apply而不能使用toUpperCase是因为Function.prototype中没有这种方法(即没有@987654328 @)。在此处查看列表:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。由于toUpperCase()是String.prototype中存在的方法,因此下面答案中的IIFE 将起作用,因为函数本身返回一个字符串。 -
@GerardoFurtado 我缺少的关键词是“通话”。关于函数是否被调用,我弄错了,所以我没有将该方法应用于返回的字符串,而是应用于函数本身。突然间,我现在完全理解了 call 方法的目的。非常感谢您的帮助!
标签: javascript method-chaining