Давайте сначала посмотрим на объяснение вызова в MDN
Метод Call () вызывает функцию или метод с указанным этим значением и несколькими указанными значениями параметров.
Примечание. Функция этого метода аналогична функции метода Apply (), только с одним отличием, то есть метод Call () принимает список нескольких параметров, в то время как метод Apply () принимает массив, содержащий несколько параметров.
грамматика
fun.call (thisarg [, arg1 [, arg2 [, ...]]]])
параметр
эторг
Это значение указано при выполнении забавной функции. Следует отметить, что указанное это значение не обязательно означает реальное это значение, когда функция выполняется. Если эта функция находится в нетронутом режиме, это значение, указанное как нулевое и неопределенное, автоматически указывает на глобальный объект (объект окна в браузере), и это значение с исходным значением (число, строка, булево значение) будет указывать на автоматический объект обертывания исходного значения.
arg1, arg2, ...
Указанный список параметров.
Примеры на MDN были нелегкими для понимания в начале. Я опубликовал их здесь. Если вы заинтересованы, вы можете проверить Call-Javascript самостоятельно.
Этот аарг здесь интерпретируется как это значение, указанное, когда веселье запускается, то есть после использования Call, это в забавных пунктах для этого? Посмотрите на код
var p = "456"; функция f1 () {this.p = "123"; } function f2 () {console.log (this.p); } f2 (); // 456 f2.call (f1 ()); // 123 f2.apply (f1 ()); // 123Первый вывод - глобальная переменная, вызванная. Позже, из -за использования вызова и применения, это в F2 указывает на F1, поэтому выход становится 123. Фактически, F1 заимствует метод F2 и выводит свой собственный P
В настоящее время удаление этого.p в f1 () выведет три 456, что подтверждает, что когда это нулевое или неопределенное, это фактически указывает на глобальную переменную.
Что касается оберточного объекта, который указывает на исходное значение, поскольку обертывающие объекты, которые я понимаю, являются временными, и только тип исходного значения выводится во время теста вместо объекта, как доказать это здесь, если кто -то знает, что он может обсудить это со мной, если вы надеетесь, что он будет обсуждаться со мной, спасибо!
Поскольку вызов может реализовать один объект, чтобы одолжить другой объект, может ли он реализовать наследование? Посмотрите на код
Функция f1 () {this.father = "Отца"} Функция f2 () {f1.call (this); this.child = "ребенок"; } var test = new f2 (); console.log (test.father); //отецВ тестировании нет отца, потому что в F2 ()
f1.call (это);
Это указывает на F2, то есть F2 заимствует метод F1, который фактически осознает наследование.
Давайте поговорим о параметрах здесь. Параметры здесь передаются весело. Давайте посмотрим на код
функция f1 () {this.p = "123"; } функция f2 (x) {console.log (this.p); console.log (x); } f2.call (f1 (), 456); // 123 // 456Выход 123 заключается в том, что P в F1, а последующий 456 - это параметр, переданный F2, который легко понять.
В основном обратите внимание на разницу между параметрами в вызове и применить
Вызов передается один за другим, а применение - это массив, переданный в
Функция f1 () {this.p = "Тестовый вызов"; } функция f2 (x, y, z) {console.log (this.p); console.log (x); console.log (y); console.log (z); } function f3 () {this.p = "test Apply"; } f2.call (f1 (), 4,5,6); f2.call (f1 (), [4,5,6]); f2.apply (f3 (), [4,5,6]); f2.apply (f3 (), 4,5,6);Вы можете увидеть результаты здесь
Первый тестовый вызов - правильный выход
Второй тестовый вызов проходит в массиве, поэтому один массив является первым выводом и два неопределенных
Третий тест абзаца применяет правильный вывод
Четвертый абзац непосредственно сообщил об ошибке из -за ошибки в формате параметра
Разница здесь должна быть очевидна