Метод цепочки JavaScript для функции - TypeError: (промежуточное значение) .methodName не является функцией - PullRequest
0 голосов
/ 04 сентября 2018

Я следил за онлайн-уроком для начинающих, который использовал методы 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());

В приведенном выше примере, почему я могу использовать метод .toUpperCase () для функции sayHello, которая использует метод apply, а не для функции sayBonjour, которая этого не делает. При попытке сделать это я получаю ошибку:

'Uncaught TypeError: (промежуточное значение) .toUpperCase не является функцией'.

Я понимаю, что это не тот способ, которым строковый метод (или другие методы) предназначен / предназначен для использования в учебных целях, я надеялся, что кто-то может объяснить, что мешает мне использовать метод таким способом.

Большое спасибо за ваше время и помощь

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Этот пример показывает, что происходит, когда ваш код исполняется.

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);
}
0 голосов
/ 04 сентября 2018

Можно, но вы пытались использовать .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);
...