Читаю документацию и не могу вкурить принцип работы. Например
(1):
Function.prototype.call.call(function(){ alert('how it works?') })
Если взять просто call применительно к какому либо методу, то вроде бы все понятно:
например
(2):
(function(){ alert(this) }).call({})
согласно документации для call (
п. 15.3.4.4):
При вызове методом call объекта func с аргументом thisArg и необязательными аргументами arg1, arg2, и т.д.,выполняются следующие шаги:
...
4.Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и argList в качестве списка аргументов.
В
(2) объектом func является анонимная ф-ия,
call вызывает [[Call]] у анонимной ф-ии, подменяя this пустым объектом.
в
(1) объектом func является другой call,
call вызывает [[Call]] у call, подменяя this анонимной функцией. И вот что тут дальше происходит непонятно.
В
п. 13.2.1
сказано:
При вызове внутреннего метода [[Call]] для объекта Function, называемого F, со значением this и списком аргументов выполняются следующие шаги:
...
2. Пусть result будет результатом вычисления FunctionBody, представляющим собой значение внутреннего свойства [[code]] для F. Если у F нет внутреннего свойства [[code]], или если его значение представляет собой пустое тело функции FunctionBody, то result равен (normal, undefined, empty).
...
Для
(2) все понятно - тупо отрабатывает тело нашей функции.
Для
(1) - ???