(new Function).call.call.call.call.call.call(myFunc);07.11.2020, 15:30. Показов 2301. Ответов 22
Метки нет (Все метки)
Итак, что для меня понятно: 1) call можно применять к любой функции. метод - это тоже функция, а call - это метод. 2) .call.call.call.call.call.call - количество этих call неважно, там уже зацикленность идёт, потому что свойство call функции call ссылается на саму себя. 3) *****.call.call.call.call(myFunc) - уже не важно, что слева идёт, потому что последний call - это запуск с заданным this предпоследнего call, а он - это "native code", т.е. Function.prototype.call Поэтому: (new Function).call.call.call.call.call.call(myFunc);то же самое, что Function.prototype.call.call(myFunc);Т.е. я как бы хочу вызвать Function.prototype.call в моём контексте this. Я ставлю по правилам контекст this в виде ссылки на объект, но даёт ошибку. А вот если ставлю туда функцию, то ошибки нет. Мало того, эта функция, переданная в качестве контекста, запускается. Почему не работает передача this-контекста? Почему нормально работает со ссылкой на функцию и почему она запускается?
2
|
||||||
| 07.11.2020, 15:30 | |
|
Ответы с готовыми решениями:
22
Выдает ошибку Uncaught RangeError: Maximum call stack size exceeded cannot call methods on dialog prior to initialization; attempted to call method 'close' Семантика javascript (function() {.}).call(this); |
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 07.11.2020, 18:29 | |
|
Ну шо можно сказать? Тёмная сторона вселенной JavaScript...
Какой-то странный случай - при отсутствии тела функции запускать thisArg как функцию.
0
|
|
| 07.11.2020, 22:15 [ТС] | |||||||
Сообщение было отмечено amr-now как решение
Решение
amr-now, тело функции есть - это call, код который мы не видим. Её и запускаем c помощью её самой и передаём как бы свой this, но эффект странный.
Добавлено через 48 минут Вот тут товарищ объясняет: https://stackoverflow.com/ques... otype-call
Код (fn.call) в строке 2 из-за скобок возвращает функцию call, теряя контекст fn. Поэтому этот fn надо вернуть первым аргументом при вызове call на call, а вторым аргументом уже идёт аргумент для "первой" call.Я только не пойму, почему fn запускается. Это же только контекст, т.е. объект. Да, функция - это объект, но почему там возникает вызов? Добавлено через 17 минут Вот нашел ещё: https://stackoverflow.com/ques... -really-do
2
|
|||||||
|
|
|
| 07.11.2020, 23:13 | |
|
DimaDima1985, честно говоря вообще ничего странного не вижу. call является методом типа Function и по умолчанию для него контекстом является как раз таки та самая функция, методом которой он и является. Что делает метод call? Правильно, он вызывает функцию контекста. Если в качестве контекста ему передается другая функция, что по-твоему он должен с ней сделать?
0
|
|
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 07.11.2020, 23:38 | |
|
diadiavova, call вызывает не функцию контекста, а тупо функцию левее точки. В аргументах подкидывает thisArg и ...params аргументов, которые должны были передаваться не в извращенном использовании функции левее точки.
В сущности мы с DimaDima1985 в шоке от неожиданного поведения объекта-функции call. Неочевидное поведение.
0
|
|
| 07.11.2020, 23:50 [ТС] | ||
|
1
|
||
|
|
|||||||
| 08.11.2020, 00:47 | |||||||
0
|
|||||||
| 08.11.2020, 09:07 [ТС] | |
|
1
|
|
|
|
|
| 08.11.2020, 09:42 | |
|
0
|
|
| 08.11.2020, 09:59 [ТС] | ||
|
Вы, похоже не поняли вообще о чем речь. Смысл в том, что call, вызванная в качестве метода самой себя, воспринимает первый переданный параметр как функцию и запускает (!) её, хотя должна первым параметром принимать объект, как значение this. По правилам синтаксиса call запускают ту функцию, на которой она вызвана как метод.
1
|
||
|
|
|||||||||
| 08.11.2020, 10:25 | |||||||||
|
Добавлено через 12 минут
0
|
|||||||||
| 08.11.2020, 10:28 [ТС] | ||||||||
|
Вы все верно пишете, но вот начиная отсюда:
func.call([thisArg[, arg1, arg2, ...argN]]) thisArg - это обычный объект, его вызов даст исключение TypeError: myObj is not a function.Добавлено через 3 минуты
1
|
||||||||
|
|
||||
| 08.11.2020, 10:33 | ||||
|
1
|
||||
| 08.11.2020, 10:40 [ТС] | |
|
Всё, я разобрался!
diadiavova, спасибо вам, хотя вы не объяснили, но натолкнули на размышление. Сейчас для amr-now напишу.
1
|
|
|
|
|||||||
| 08.11.2020, 10:44 | |||||||
|
DimaDima1985, еще маленькая иллюстрация
Добавлено через 47 секунд
0
|
|||||||
| 08.11.2020, 10:54 [ТС] | |
|
Тут дело в том, КАК работает
call, ЧТО именно он делает, хоть мы и не видим его внутренний код.Вот обычный вызов call:1) myFunc.call(obj, arg);Здесь привычный синтаксис, всё понятно. Но что именно call делает? Он как бы переносит myFunc внутрь obj и как бы делает его свойством myFunc. Поэтому получается так после использования call:2) obj.myFunc(arg);Вот и всё. myFunc вызывается из obj - значит, в myFunc в качестве this сидит obj.Идём далее. Помечу два call цифрами, чтобы не путаться:1) call1.call2(myFunc, arg);превращается внутри обработчика javascript в: 2) myFunc.call1(arg);парам-папам. myFunc вызывается! Ну и параметр у неё arg. В общем, некорректно говорить, что call "подменяет" this где-то в недрах интерпретатора. Метод call именно переносит функцию, на которой вызван, внутрь объекта и оттуда уже вызывает её.Добавлено через 6 минут Всё это можно было бы сразу понять, если бы был виден внутренний native код метода call, ну или если бы учебники четко объясняли, ЧТО именно делает call. Нет там никакой хитрой подмены "this", там временный перенос в объект, вызов и удаление из объекта.
1
|
|
|
|
|||
| 08.11.2020, 10:59 | |||
|
0
|
|||
| 08.11.2020, 11:16 [ТС] | |
|
diadiavova, ваше объяснение я тоже стал понимать, но по моему объяснению можно даже написать
альтернативную функцию и запихнуть её в Function.prototype и будет некий аналог call. Добавлено через 3 минуты Или вот так можно объяснить: в строке myFunc.call(obj, arg);для метода call в качестве this является функция myFunc (ведь функция - это тоже объект) и call её вызывает, передавая в неё arg.
0
|
|
|
|
||||
| 08.11.2020, 11:23 | ||||
|
Добавлено через 2 минуты
1
|
||||
|
755 / 359 / 100
Регистрация: 04.10.2018
Сообщений: 548
|
||||||||||||
| 08.11.2020, 12:29 | ||||||||||||
|
Всем привет особенно DimaDima1985, мы с тобой уже не первый раз пытаемся понять JS XD
Я тут порылся в Интернетах и нашел несколько реализаций call Вот код
И в приведенном примере мы не увидим Hello
Добавлено через 1 минуту А еще я узнал про новый синтаксис new Function
0
|
||||||||||||
| 08.11.2020, 12:29 | |
|
Помогаю со студенческими работами здесь
20
Call a member function query() on a non-object Call a member function query() on a non-object
Отличия call (apply) от bind API Call HTTP Request Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|