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

时间:2018-09-04 11:46:51

标签: 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();

let sayBonjour = function() {
  return 'Bonjour!';
}.toUpperCase();

console.log(sayHello);
console.log(sayBonjour());

在上面的示例中,为什么我可以对使用apply方法的sayHello函数使用.toUpperCase()方法,而不对不使用的sayBonjour函数使用.toUpperCase()方法。尝试这样做时出现错误:

“未捕获的TypeError :(中间值)。toUpperCase不是函数”。

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

非常感谢您的时间和帮助

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

此示例显示了在执行代码时发生的情况。

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