(new Function).call.call.call.call.call.call(myFunc);07.11.2020, 15:30. Показов 2272. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|