Так и в чем собственно вопрос?
1) Почему в возвращаемой функции ((2)) теряется тот this который был в ((1)), разве при вызове ((3)) интерпритатор не должен искать this выше в коде?
Function.prototype.anyMeth=function(obj){
fn=this // ((1))
document.write(fn.name+"<br>") // просто для проверки того, на что указывает в данном случае this
return 'anyShit'
};function(){ // ((2))
document.write(this+"<br>") // ((3))
return fn.call(!this ? this : obj) // ((4))
}(или это работает только с замыканиями, а на зыс это не распространяется) Не понимаю как получается, что находясь в скоупе Function.prototype.anyMeth=function(obj), this указывает на объект (на функцию) из которой будет вызываться метод anyMeth, но в возвращаемой из этого скоупа функции мы теряем этот this, в строке ((3))
this влияет только способ вызова, это не переменная, а особое слово.это и есть та самая потеря контекста и возврат к привязке по умолчанию, тоесть объекту window, или как?
this равен window происходит потому, что вы сами вызываете без контекста: hoj(c);Проблема в том, что фраза "зыс определяется не там где объявленна функция, а там где вызывается" сбивает меня с толку, в случаях типо fn.call(!this ? this : obj) (т.к. функция эта вызывается внутри другой функции, у которой свой this внутри, но при этом она обозначает не этот зыс), вообщем спасибо заранее за ответ!
var hoj = back.anyMeth();, this принимает значение back, создаётся и записывается(но не вызывается!) в переменную hoj функция:function(){ // ((2))
document.write(this+"<br>") // ((3))
return fn.call(!this ? this : obj) // ((4))
} для которой, благодаря замыканию запомнены переменные: fn, которой присвоен this на момент вызова, т.е. black;obj, который undefined, потому что функция вызвана без параметров.anyMeth отработала, никакого this нет.hoj(с) без всякого контекста:this принимает значение window в обычном и undefined в строгом режиме;c нигде не используется;fn замкнут и равен black;obj замкнут и undefined.fn через call которому в качестве параметра в любом случае передаётся undefined: this для просто вызваной вызывнной функции - undefuned, !undefuned -> truefn.call(!undefuned ? undefuned : obj) -> fn.call(undefuned);this для просто вызваной вызывнной функции - window, !window -> false, obj -> undeined(п.4), fn.call(!window ? window : undeined) -> fn.call(undefuned).undefined как параметра равносильна в принципе отсутствию переданных параметров, т.о. fn.call(undefuned) равносильно fn.call(), что в свою очередь равносильно fn(), что в конкретном случае равносильно(п.3) black(). back() без всякого контекста.