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
-> true
fn.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()
без всякого контекста.
Он наверное ожидал что в es6 появилась какая-то особая магия, которая сможет это дело сократить.
max2020, ответ нет, не появилось. Javascript развивается в сторону сахара, абстракций и упрощений. Низкоуровневая работа с кодами символов не входит в список распространённых задач.
Можно конечно использовать TextDecoder, применить for of и ещё что-нить новомодное, но это приведёт лишь к замедлению и, скорее всего, уменьшению читаемости. Смысла в этом нет.