принцип работы call довольно прост.
Если подумать что делает этот вызов:
func1.call(obj);
Правильно, выполняет функцию
func1 так как в качестве контекста у метода
call указана функция
func1, и соответственно он выполняет эту функцию, при этом передав в нее в качестве контекста объект
obj
Пример:
function func1() {
// здесь this это контекст
alert(this.ololo);
}
var obj = {ololo: "ololo"};
func1.call(obj); // выполняем функцию передав контекст obj
И так, из примера выше видно что
call просто выполняет функцию в контексте которой он был вызван, при этом в качестве аргумента
call принимает объект в контексте которого выполнит функцию...
А теперь что же делает вариант с:
func1.call.call(func2);
в этом примере, второй
call будет выполнять первый
call, передав в нее необходимый контекст. А так как функция
call должна принять в качестве контекста функцию, то тут второй
call просто меняет контекст (функцию) у первого
call и вызывает его. После срабатывает первый
call и манипулирует уже с функцией переданной вторым
call в качестве контекста.
PS. Что-то сдается мне, что я тоже не понятно объяснил.