JavaScript将方法链接到函数-TypeError:(中间值)。methodName不是函数

JavaScript将方法链接到函数-TypeError:(中间值)。methodName不是函数,javascript,method-chaining,Javascript,Method Chaining,我正在学习一个面向初学者的在线课程,该课程使用apply/bind方法为函数设置“this”上下文 我看到可以将bind方法直接链接到函数块,这对我来说是新的。因此,我开始思考,为什么除了bind/call/apply之外,我不能链接其他方法来影响返回值 let obj = { name: 'john', }; let sayHello = function() { return 'hello there ' + this.name; }.apply(obj).toUpperCase(

我正在学习一个面向初学者的在线课程,该课程使用apply/bind方法为函数设置“this”上下文

我看到可以将bind方法直接链接到函数块,这对我来说是新的。因此,我开始思考,为什么除了bind/call/apply之外,我不能链接其他方法来影响返回值

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函数不使用.toUpperCase()方法。在尝试这样做时,我得到了一个错误:

'Uncaught TypeError:(中间值)。toUpperCase不是函数'

我意识到这不是使用字符串方法(或其他方法)的方式,出于学习目的,我希望有人能解释是什么阻止我以这种方式使用该方法


非常感谢您的时间和帮助

您可以,但您尝试在函数上使用
.toUpperCase
。您可以在将由函数表达式返回的字符串上使用它。您可以使用来实现这一点

让obj={
姓名:'约翰',
};
让sayHello=function(){
返回'hello there'+this.name;
}.apply(obj.toUpperCase();
让sayBonjour=(函数(){
回复“你好!”;
})()toUpperCase();
console.log(sayHello);

console.log(晚安)此示例显示了检查代码时发生的情况

函数打印(值){
const str=Object.prototype.toString.apply(值);
log(“类型:”+str.slice(7,str.length-1)+“\t值:”+value);
}
设obj={
姓名:“约翰”
};
/*
让sayHello=function(){
返回'hello there'+this.name;
}.apply(obj.toUpperCase();
*/
//等于
{
console.log(“sayHello案例”);
设step1=函数(){
返回“hello there”+this.name;
};
打印(步骤1);
让步骤2=步骤1.应用(obj);
打印(步骤2);
让sayHello=step2.toUpperCase();
打印(说你好);
}
/*
让sayBonjour=函数(){
回复“你好!”;
}.toUpperCase();
*/
//等于
{
console.log(“早安案例”);
设step1=函数(){
返回“你好!”;
};
打印(步骤1);
让sayBonjour=step1.toUpperCase();
印刷品(晚安);

}
之所以可以使用
bind
call
apply
而不是
toUpperCase
是因为
函数.prototype
中没有这样的方法(也就是说,没有
函数.prototype.toUpperCase()
)。请看下面的列表:。由于
toUpperCase()
String中的一个方法。prototype
下面答案中的IIFE将起作用,因为函数本身返回一个字符串。@GerardoFurtado我缺少的关键字是“call”。我对函数是否被调用的看法是错误的,因此我没有将该方法应用于返回的字符串,而是应用于函数本身。现在我突然完全明白了调用方法的目的。非常感谢你的帮助!这个答案非常有帮助,非常感谢您的帮助我觉得提供的另一个答案的格式更简洁,尽管我希望我也能选择这个作为正确的答案,因为对正在发生的事情的分解确实帮助我理解了这个概念。再次感谢你。我现在完全明白了为了这个目的而使用生命。非常感谢你的帮助。总而言之,我认为我实际上是在对返回的字符串本身使用.toUpperCase()方法,但我错了。我已经更好地理解了call方法的用途,它调用函数,然后返回我所期望的字符串。