Chyba przedefiniować Function.prototype.call
i Function.prototype.apply
(i zdać kolejny argument do funkcji), nie sposób robić to - rzeczywistych mechanizmów wewnętrznych (funkcja wewnętrzny [[Call]]
) nie zapewniają żadnej metody sygnalizacji, który nazywa się używając ()
.
Porównaj specyfikację dla general function call i dla Function.prototype.apply
- każda wywołuje wewnętrzny kod funkcji w dokładnie taki sam sposób i nie istnieje żaden zestaw właściwości zewnętrznych, który jest w stanie podać, czy jest wywoływany z użyciem tego, czy nie.
Zobacz specyfikację dla funkcji wewnętrznej [[Call]]
:
13.2.1 [[Call]]
Gdy wewnętrzne metody obiektu funkcja F jest wywoływana z tej wartości oraz listę argumentów [[Call]]
następujące kroki są podejmowane:
- Niech funcCtx będzie wynikiem ustanowienia nowego kontekstu wykonania dla kodu funkcji przy użyciu wartości F [[Formal Parametry]] właściwość wewnętrzna, przekazane argumenty Lista argumentów, i ta wartość jak opisano w 10.4.3.
- Wynik powinien być wynikiem oceny FunctionBody, który jest wartością właściwości wewnętrznej F [[Code]]. Jeśli F nie ma właściwości wewnętrznej [[Code]] lub jej wartością jest pusta funkcja FunctionBody, wówczas wynik jest (normalny, niezdefiniowany, pusty).
- Wyjdź z kontekstu wykonywania funcCtx, przywracając poprzedni kontekst wykonania.
- Jeśli result.type to rzut, to rzuć result.value.
- Jeśli result.type zostanie zwrócony, a następnie return result.value.
- W przeciwnym razie result.type musi być normalne. Return undefined.
Nie ma przepisu, aby zmienić bieg zależności od tego, czy jest ona wywoływana przy użyciu call
/apply
czy nie - jedyną rzeczą, która zmienia się co robi są argumenty dla samej funkcji, a co this
ma być w funkcji.
Powiedziałbym, że masz na myśli 'foo.call (this, {bar: 1}))' 'i' foo.apply (this, [{bar: 1}])), 'prawda? –