【问题标题】:JavaScript chaining method to function - TypeError: (intermediate value).methodName is not a functionJavaScript 将方法链接到函数 - TypeError: (intermediate value).methodName 不是函数
【发布时间】: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'.

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

非常感谢您的时间和帮助

【问题讨论】:

  • 之所以可以使用bindcallapply而不能使用toUpperCase是因为Function.prototype中没有这种方法(即没有@987654328 @)。在此处查看列表:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。由于toUpperCase()String.prototype 中存在的方法,因此下面答案中的IIFE 将起作用,因为函数本身返回一个字符串。
  • @GerardoFurtado 我缺少的关键词是“通话”。关于函数是否被调用,我弄错了,所以我没有将该方法应用于返回的字符串,而是应用于函数本身。突然间,我现在完全理解了 call 方法的目的。非常感谢您的帮助!

标签: javascript method-chaining


【解决方案1】:

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

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);

【讨论】:

  • 我现在完全理解为此目的使用 IIFE。非常感谢您的帮助。回顾一下,我认为我实际上是在返回的字符串本身上使用 .toUpperCase() 方法,但我错了。我已经更好地理解了调用方法的目的,它调用了函数,然后返回了我期望的字符串。
【解决方案2】:

这个例子展示了当你的代码被执行时发生了什么。

function print(value) {
	const str = Object.prototype.toString.apply(value);
	console.log("Type: " + str.slice(7, str.length - 1) + "\tValue: " + value);
}

let obj = {
	name: "john"
};
/*
let sayHello = function() {
	return 'hello there ' + this.name;
}.apply(obj).toUpperCase();
*/
// equals to
{
	console.log("sayHello case");
	let step1 = function () {
		return "hello there " + this.name;
	};
	print(step1);
	let step2 = step1.apply(obj);
	print(step2);
	let sayHello = step2.toUpperCase();
	print(sayHello);
}
/*
let sayBonjour = function() {
	return 'Bonjour!';
}.toUpperCase();
*/
// equals to
{
	console.log("sayBonjour case");
	let step1 = function () {
		return "Bonjour!";
	};
	print(step1);
	let sayBonjour = step1.toUpperCase();
	print(sayBonjour);
}

【讨论】:

  • 这个答案非常有帮助,非常感谢您的帮助! - 我觉得提供的另一个答案的格式更简洁,尽管我希望我也可以选择这个作为正确答案,因为对正在发生的事情的分解确实帮助我理解了这个概念。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
相关资源
最近更新 更多