2015-06-04 5 views
9

Es ist der Code-Snippet in den Async library:Was ist der Zweck von `root = ...` Code in Async-Bibliothek?

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

Gibt es einen Grund für all diesen Codes? Warum hat der Autor nicht einfach root = this verwendet? Die erste Bedingung ist nur gültig, wenn this === window, also root = window und root = this gleichwertig sein sollten. Gleiches gilt für die zweite Bedingung, wobei root = globalroot = this entspricht.

Fehle ich hier etwas?

+1

[ich den Autor gefragt] (https://twitter.com/DenysSeguret/status/606427206806568960). Er wird wahrscheinlich eine bessere Antwort als meine geben;) –

Antwort

7

Nicht nur ist es redundant, es scheint auch fehlerhaft zu sein.

Kurz vor Ihrem Schnipsel, dann ist es diese:

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

So ist das Ziel, root das globale Objekt zuweisen.

Eine solche Bibliothek sollte so codiert sein, dass sie im strikten Modus arbeitet (nicht nur im strikten Modus, sondern mindestens konform). Und im strikten Modus ist der Kontext einer IIFE-Ausführung undefined. Dieser Code würde das Stammobjekt sowohl im Knoten als auch im Browser immer im strikten Modus nicht finden.

Beachten Sie, dass es zuverlässige Möglichkeiten gibt, das Stammobjekt zu finden. Der Standard ist ein indirect call zu tun:

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

* nicht wie redundanter Code *. Kannst du erklären warum nicht? Angenommen, der strikte Modus wird von der Bibliothek nicht unterstützt, wird die ursprüngliche Frage nicht beantwortet. – CodingIntrigue

+0

@RGraham "Angenommen, der strikte Modus wird nicht unterstützt", handelt es sich offensichtlich um einen redundanten Code. Aber unter der Annahme, dass diese Bibliothek seit sehr langer Zeit veraltet ist. Es gab eine Absicht, die so viel Code rechtfertigte und ich denke, ich habe es erklärt, was es war, es ist einfach fehlerhaft, weil es '&&' anstelle von '||' verwendet. –

+0

Aber die 'use strict' müsste global definiert werden, damit Ihr Anwendungsfall getroffen wurde, oder? Was nicht Standard ist, hätte ich nicht gedacht. Auf jeden Fall habe ich kein Problem mit Ihrer Antwort, aber ich war daran interessiert, warum genau der Code * redundant ist * anders als einfach "es ist". – CodingIntrigue