2015-06-04 8 views
9

Jest to fragment kodu w Async library:Jaki jest cel "root = ..." kodu w bibliotece Async?

if (typeof window == 'object' && this === window) { 
    root = window; 
} 
else if (typeof global == 'object' && this === global) { 
    root = global; 
} 
else { 
    root = this; 
} 

Czy jest jakiś powód, dla wszystkich tego kodu? Dlaczego autor nie użył po prostu root = this?

Pierwszy warunek jest ważny tylko wtedy, gdy this === window, a więc root = window i root = this powinien być równoważny. To samo w drugim warunku, gdzie root = global powinno być równoważne z root = this.

Czy tu czegoś brakuje?

+1

[poprosiłem autora] (https://twitter.com/DenysSeguret/status/606427206806568960). Prawdopodobnie da lepszą odpowiedź niż moja;) –

Odpowiedz

7

Nie tylko jest zbędny, ale także wydaje się być wadliwy.

Tuż przed swoim fragmencie, jest to:

// global on the server, window in the browser 
var root, previous_async; 

Więc celem jest przypisanie do root globalnego obiektu.

Taka biblioteka powinna być zakodowana do pracy w trybie ścisłym (nie tylko w trybie ścisłym, ale powinna być przynajmniej zgodna). W trybie ścisłym kontekstem wykonania IIFE jest undefined. Ten kod zawsze nie odnalazłby obiektu głównego w trybie ścisłym, zarówno w węźle, jak i w przeglądarce.

Należy pamiętać, że istnieją niezawodne sposoby na znalezienie obiektu głównego. Standardowo jeden ma zrobić indirect call:

var root = (1,eval)('this'); 
+0

* Nie podoba mi się nadmiarowy kod *. Czy możesz wyjaśnić, dlaczego nie? Zakładając, że tryb ścisły nie jest obsługiwany przez bibliotekę, nie odpowiada na oryginalne pytanie. – CodingIntrigue

+0

@RGraham "Zakładając, że tryb ścisły nie jest obsługiwany", jest to oczywiście kod nadmiarowy. Ale zakładając, że to jest jak zakładanie, że ta biblioteka jest przestarzała od bardzo długiego czasu. Istniała intencja uzasadniająca tak wiele kodu i myślę, że wyjaśniłem, co to jest, jest po prostu błędna, ponieważ używa '&&' zamiast '||'. –

+0

Ale "użyj ścisłego" musiałby być zdefiniowany globalnie, aby twój przypadek użycia został trafiony, prawda? Co nie jest standardową praktyką, której bym nie pomyślał. W każdym razie nie mam problemu z twoją odpowiedzią, ale interesowało mnie, dlaczego dokładnie kod * jest zbędny * inny niż po prostu "jest". – CodingIntrigue