Стандарт ECMA определяет скрытое внутреннее свойство [[Call]], которое, если оно реализовано, означает, что объект может быть вызван / является функцией.
В Python происходит нечто подобное, за исключением того, что вы можете переопределить это самостоятельно, чтобы создать свои собственные вызываемые объекты:
>>> class B:
... def __call__(self, x,y): print x,y
...
>>> inst = B()
>>> inst(1,2)
1, 2
Есть ли аналогичный механизм в стандартном JavaScript? Если нет, то как насчет любой из текущих реализаций JavaScript?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Насколько я знаю, это невозможно. Предполагается, что это внутреннее свойство объекта, а не сам сценарий. Я знаю только один способ - определить функцию.
Однако, поскольку функции являются первоклассными гражданами, вы можете добавлять к ним свойства:
function myfunc(){
var myself = arguments.callee;
myself.anotherfunc();
}
myfunc.avalue=5;
myfunc.anotherfunc=function(){
alert(this.avalue);
}
myfunc(); //Alerts 5
myfunc.anotherfunc(); //Alerts 5
Пока это невозможно: [[Call]] скрыт и не доступен напрямую во всех реализациях соответствия. Это может измениться в новый стандарт ECMAScript.
[[Call]] - это внутреннее свойство, используемое для описания определенной части функциональности в спецификации языка. Нет никакой гарантии, что такое свойство доступно даже в интерпретаторе. Есть много других свойств и объектов, на которые ссылаются в спецификации, такие как объект Completion, который необходим только в том случае, если вы реализовали язык как интерпретатор AST, который использовали KJS и JavaScriptCore (KJS, KJS == вилка WebKit). делать. Интерпретаторы, не основанные на AST (SpiderMonkey, новые механизмы выполнения KJS и JavaScriptCore FrostByte и SquirrelFish, возможно, движок Opera JS и V8) не нуждаются в большом количестве этих конструкций, поскольку они используются в основном для описания поведения, а не выполнение.
Есть еще одна причина, по которой такой доступ недоступен - многие из этих свойств настолько присущи интерпретатору, что разрешение настраиваемого поведения может повлиять на производительность независимо от того, используются эти функции или нет - например, API JSC предоставляет механизм для embedder, чтобы переопределить некоторые из этих свойств, и поддержка этого даже на уровне C фактически оказывает влияние на производительность измеримый.
[Обновлено: небольшое примечание, когда я говорю «интпредставитель», я имею в виду в общем смысле - это может быть интерпретация AST, байт-кода или машинного кода (например, jit)]
Приложения, использующие реализацию Javascript 1.5 или более поздней версии Mozilla Spidermonkey (например, Firefox), имеют доступ к механизму __noSuchMethod__:
c:\>jsdb
js>x = {};
[object Object]
js>x.__noSuchMethod__ = function(id,args) {writeln('you just called: '+id+'()');}
function (id, args) {
writeln("you just called: " + id + "()");
}
js>x.foo()
you just called: foo()
js>x.bar()
you just called: bar()
js>