Zamknięcie JavaScript i ten obiekt

Myślałem, że dobrze rozumiemthis obiekt w JavaScript. W kontaktach z obiektami, wywołaniami zwrotnymi oraz zdarzeniami i programami obsługi nie miałem z tym problemu od niepamiętnych czasów. Teraz wszystko się zmieniło.

Zakochałem się w JavaScript. Czysty JS, czyli nie jQuery, prototype.js, dojo ... Więc naturalnie zacząłem używać zamknięć. W niektórych przypadkach jednakthis tutaj mnie osłania. Weź ten fragment:

<code>function anyFunc(par)
{
    //console.log(par);
    console.log(this);
}

function makeClosure(func)
{
    return function(par)
    {
        return func(par);
    }
}
var close = makeClosure(anyFunc);
close('Foo');

var objWithClosure = {cls:makeClosure(anyFunc),prop:'foobar'};
objWithClosure.cls(objWithClosure.prop);

var scndObj = {prop:'Foobar2'};
scndObj.cls = makeClosure;
scndObj.cls = scndObj.cls(anyFunc);
scndObj.cls(scndObj.prop);
</code>

We wszystkich trzech przypadkachthis loguje się jako obiekt okna. To łatwa poprawka, oczywiście:

<code>function makeClosure(func)
{
    return function(par)
    {
        return func.call(this,par);
    }
}
</code>

Ta poprawka działa, umieściłem ją tutaj, aby uniknąć odpowiedzi na to pytanie, bez wyjaśniania tego, co muszę wiedzieć: dlaczego tak się dzieje w tym miejscu?

zapewnia, że ​​dzwoniący jest faktycznie obiektem, do którego należy zamknięcie. To, czego nie rozumiem, jest następujące: Oczywiście,this wskazuje na obiekt okna w pierwszym przypadku, ale w innych przypadkach nie powinien. Próbowałem logowaniathis w funkcji makeClosure tuż przed powrotem i rejestrował sam obiekt, a niewindow obiekt. Ale kiedy używane jest rzeczywiste zamknięcie,this powraca do wskazywania obiektu okna. Czemu?

Jedyne, co mogę myśleć, to to, że przechodząc obokanyFunc funkcjonować jako argument, właściwie przechodzęwindow.anyFunc. Spróbowałem więc tej szybkiej poprawki:

<code>function makeClosure(func)
{
    var theFunc = func;
    return function(par)
    {
        theFunc(par);
    }
}
</code>

Przy oczekiwanych wynikachthis teraz wskazuje na obiekty, ale znowu: Dlaczego? Mam kilka pomysłów (theFunc to odwołanie do funkcji w zasięgu lokalnym [this > private: theFunc]?), ale jestem pewien, że są tutaj ludzie o znacznie większej wiedzy na temat JS, więc miałem nadzieję uzyskać więcej wyjaśnień lub linki do artykułów wartych przeczytania ...

Dzięki

Aktualizacja

Oto skrzypce, może zostawiłam coś, ale tutaj zapisuje się różne rzeczy;)

Edytuj / Aktualizuj 2

Sprawa, która mnie myli jest tutaj.

Edycja końcowa

Ok, robi się dość niechlujny post. Aby wyjaśnić: oczekiwałem zachowania podobnego do tego:

<code>function makeClosure()
{
    function fromThisFunc()
    {
        console.log(this);
    }
    return fromThisFunc;
}

var windowContext = makeClosure();
windowContext();
var objectContext = {cls:makeClosure()};
objectContext.cls();
</code>

To, co mnie złapało, to ta funkcjaanyFunc nie został zadeklarowany we właściwym zakresie, a zatemthis wskazał obiekt okna. Odkryłem to czytającstarożytny zwój Znalazłem gdzieś w sieci.

Ale stało się coś bardziej skomplikowanego, ponieważ obiekt funkcji, do którego teraz odwołuje się globalVar, został utworzony z właściwością [[scope]] odnoszącą się do łańcucha zasięgu zawierającego obiekt Aktywacja / Zmienna należący do kontekstu wykonania, w którym został utworzony (i obiekt globalny). Teraz obiekt Aktywacja / Zmienna nie może być zbierany jako śmieci, ponieważ wykonanie obiektu funkcji, do którego odnosi się globalVar, będzie musiało dodać cały łańcuch zasięgu z jego właściwości [[scope]] do zakresu kontekstu wykonania utworzonego dla każdego wywołania to.

To, co musiałem zrobić, to uprościć, a nie skomplikować:

<code>function fromThisFunc()
{
    console.log(this);
}

function makeClosure(funcRef)
{
    //some code here
    return funcRef;
}
</code>

To powinno działać, prawda?

PS: Z wyjątkiem odpowiedzi Alnitaka, ale specjalne podziękowania należą się Felixowi Klingowi za całą cierpliwość i informacje.

questionAnswers(2)

yourAnswerToTheQuestion