Тип String.call.call? [Дубликат]

1

Это верно (запустите его в консоли в Google Chrome):

typeof String.call.call === 'function'

Но называя его как String.call.call() выдает ошибку, говоря, что это не функция:
Uncaught TypeError: String.call.call не является функцией: 1:13

Почему пытается вызвать функцию (в соответствии с его typeof определения) выдает ошибку, говоря, что это не функция? Действительно ли это функция или нет?

Обратите внимание, что это происходит с другими классами, такими как Number, Function или другие, которые наследуют метод .call.

Теги:
function
google-chrome

1 ответ

1

Попробуем разбить это на более управляемые части.

String является конструктором (или гибридом статической функции/конструктора, каким бы вы его ни называли), и как таковой, он наследует от Function.prototype, потому что это функция.

call - это функция, которая выполняет свой контекст (this) с контекстом, заданным ему в первом параметре:

console.log(String.call(true));
console.log(Array.call(null));
console.log(Function.call('so?'));
console.log(Object.call(/notice me/));

Давайте посмотрим на более официальное определение Function.call():

call() метод вызывает function с заданным this значением и arguments при условии индивидуально.

function.call(thisArg, arg1, arg2, ...)

Теперь интересная часть здесь отмечает, что эти три идентичны:

'use strict';

var callRef = String.call; // Function.call, Array.call, Boolean.call, all of them are ===

console.log(String(/make me into a string/));
console.log(String.call(undefined, /make me into a string/));
console.log(callRef.call(String, undefined, /make me into a string/));

callRef.call(String) означает вызов callRef() с контекстом String, то есть выполнение String() с контекстом и параметрами, представленными в следующих аргументах.

Как мы помним, контекст не имеет особого значения, но теперь мы знаем, что первый параметр callRef.call() имеет значение, поскольку он определяет, какую функцию выполнять, поскольку он сообщает callRef() каков его контекст, который получает выполненный как функция с контекстом, представленным в следующем параметре.

Теперь, размышляя над первоначальным вопросом, что происходит, когда мы пытаемся выполнить String.call.call()? Ну, если параметр не указан, он не undefined, и мы знаем, что typeof undefined !== 'function'.

Итак, вот мой окончательный ответ:

String.call.call() действительно функция... но все, что она делает, пытается выполнить undefined как функцию, которая, очевидно, не является.

String.call.call();

Надеюсь, это было интересное и информативное объяснение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню