Global Domination, Part Two

16. April 2008 um 13.29 Uhr von Douglas Crockford | In Entwicklung | 9 Kommentare

Als ich die Praxis der Kunst der Programmierung weiter, bin ich immer meine Prüfung Praktiken. Kann ich die Muster, die ich benutze, so dass ich meine Programme klarer, stärker, besser? Dies ist besonders wichtig bei der Arbeit mit einer Sprache wie JavaScript, die eine Abweichung, die Muster, die verwirrend, schwach und schlechter sind begünstigt hat.

Eine der schlimmsten Eigenschaften von JavaScript ist ihre Abhängigkeit von globalen Variablen. Dies kann mit gemildert werden globale Minderung und das Modul-Muster , die signifikant reduzieren kann die Anzahl der globalen Variablen, die wir zu erklären braucht.

Aber wenn wir müssen eine globale Variable zu deklarieren, sollte wie wir am besten tun? JavaScript bietet drei Möglichkeiten der Deklaration einer globalen Variablen, und sie haben alle Probleme. Welches ist mindestens schlimmsten?

Die erste besteht darin, einen neuen Namen außerhalb jeder Funktion zuweisen.

  Schade = {}; / / Die erste Form 

Die zweite ist die Verwendung var Schlüsselwort außerhalb jeder Funktion.

  var schade = {}; / / Die zweite Form 

Die dritte ist eine Eigenschaft des globalen Objekts zuweisen.

  this.pity = {}; / / Die dritte Form 

Alle drei Formen dasselbe tun. (Es gibt auch einen vierten Weg, der abscheulichen stillschweigend global, aber wir werden nicht von hier zu sprechen. Und verstehen Sie mich nicht begonnen auf dem fünften und sechsten Möglichkeiten.)

Also, drei Möglichkeiten, um die gleiche Sache, die wir tun sollten, gegeben? Früher habe ich die zweite Möglichkeit bevorzugen. Es sah für mich am deutlichsten in Angabe (oder zumindest darauf hindeutet) meine Absicht, etwas zu erklären.

Aber es war nicht ganz zufriedenstellend. Lesen Sie zuerst einige Leute var in dieser Position wie die Deklaration der Variablen in den Anwendungsbereich der Zusammenstellung Einheit, ähnlich wie bei der static Werke in C. Dies ist eine nützliche Lektüre sein würde, es sei denn, dass JavaScript nicht Kompilierungseinheit Umfang. Ein erfahrener Programmierer sollte wissen, dass, sondern ein alarmierendes Anteil der Web-Entwickler-Programm in Unkenntnis der Sprache, so ist dies eine leichte Besorgnis.

Eine größere Sorge ist, dass die zweite Form größer ist als die erste Form ist, aber nicht dasselbe. Grundsätzlich bevorzuge ich minimal Formen.

Aber die Sache, die mich schließlich überzeugt, dass die erste Form die am wenigsten schlechte ist, dass der IE kommt die zweite Form falsch, so dass verantwortungsvoll adaptive Programme bei der Verwendung von Konstrukten wie nicht

  var schade = this.pity | | {}; 

Um maximal produktiv, ich möchte auf Funktionen, die Portabilität Probleme zu vermeiden. Es hat mich zu lange zu akzeptieren, dass die zweite Form problematisch und sollte daher vermieden werden.

Das, was ich über die zweite Form gefallen hat, war, dass es mehrerer vorsätzlicher schien. Durch die Eingabe von var , erklärte ich, dass dies nicht eine zufällige Rechtschreibfehler. Ich bin absichtlich erklärt eine neue globale Variable. Aber JavaScript achtete nicht darauf. Ich fühle immer noch die Notwendigkeit, dass die Absicht, so dass ich es Zustand in einem Kommentar.

  / * Global schade * /
     Schade = {}; 

JSLint der Lage ist, diese Bemerkung zu verstehen, und kann mich auf alle globalen Variablen, die ich nicht absichtlich tat erklären aufmerksam zu machen. Das gibt mir Zuversicht, dass ich nicht machen ein häufiger Fehler. Die zweite Form gab mir das Gefühl gut, aber nicht wirklich mir keine wirkliche Sicherheit.

Ich bin immer noch lernen, wie man programmiert. Ich las Code, und ich halte die Meinungen von anderen Programmierern. Ich habe immer noch die Fähigkeit, meine Praktiken zu ändern. Es ist schwer, manchmal zugeben, dass meine bisherigen Praktiken schwach waren. Aber das ist mehr als durch die Einführung von Praktiken, die stärker sind ausgeglichen.

Share and erweitern: Lesezeichen mit del.icio.us | digg it! | reddit!

9 Kommentare

  1. Testen der Kommentar-System, das für eine Weile dort war. Alles scheint wieder normal, obwohl, so give it a go!

    Kommentar von Administrator - 21. April 2008 #

  2. Ich würde denken, dass es allgemein bekannt ist, zu prüfen, typeof pity === 'undefined' , anstatt mit einem Konstrukt wie var pity = this.pity || {}; , insbesondere davon aus, dass der Code in Frage das Nebenprodukt einer recht ist adaptive Programm.

    Falls Sie vermuten, dass die Web-Entwickler Publikum, das Programm in Unkenntnis der Sprache und der Leser dieses Blogs (oder die Leserschaft von JavaScript Blog Autor, der diese Methode nimmt) gegenseitig ausschließen, dann könnte man Richtung auf eine Einigung Trend Ihren dritte Form angemessen ist .

    Aber zu sehen, dass die meisten Entwickler "lernen" kopieren und einfügen, wie es scheint, dass die zweite Form wäre sicherer, wenn auch aus keinem anderen Grund als die abscheulichen globals verhindern wir alle verabscheuen.

    Kommentar von Zach Leatherman - 21. April 2008 #

  3. Die "var schade = this.pity | | {}" und es ist Varianten hat ziemlich populär geworden in den letzten Javascript-Bibliotheken, und Ich mag es mich. Du musst zu geben in der Annahme, dass Sie es in Orten, wo booleans sind nicht Werte, die Sie erwarten.

    Eines der nützlichsten Fällen wäre für mich als Default-Wert für Funktionsparameter werden. Bedenken Sie:

    Funktion doSomething (a) {
    a = a | | 'defaultValue';
    }

    Wenn die Variable 'a' ist undefiniert hier, es wird ein Standardwert stattdessen bekommen, so dass die Variable 'a' nützlich, der Rest der Funktion.

    Obwohl, wenn Sie es vorziehen, ich denke, es folgendermaßen geschrieben werden:

    Funktion doSomething (a) {
    a = (! a == undefined a:? defaultValue ');
    }

    Kommentar von Frode Danielsen - 1. Mai 2008 #

  4. [...] Würde lügen, wenn ich sagte, ich sei nicht von außen auf diese beeinflusst. Douglas Crockford hat eine Menge tolle Empfehlungen, und dies ist eine Ich stimme eher zu [...]

    Pingback von scriptNode / My New Coding Habits - 2. August 2008 #

  5. Ich mag, wie die ExtJS Bibliothek dies handhabt. Sie abstrakte Entwickler weg vom Problem, indem ein Programm zu erstellen "Namespaces." Ich weiß nicht, wie genau sie tun es unter der Decke, aber ich weiß, dass Douglas Crockford javascript Ort einen starken Einfluss auf ihre Entwicklung ist, so würde ich nicht überrascht, dass sie eine der Formen oben vorgestellten verwenden. Als Entwickler ist allerdings, alles was ich habe, dies zu tun:
    Ext.namespace ("Schade, ');
    oder diese kürzere Form:
    Ext.ns ("Schade, ');
    Ich kann sogar erklären, mehrere Ebenen auf eine einzige Zeile:
    Ext.ns ("Schade", "pity.util ',' pity.util.text ');

    Kommentar von Bernie Margolis - 19. November 2008 #

  6. eine andere Form, die ich normalerweise lieber ist:

    this.pity | | (this.pity = {});

    der Grund ist, es vermeidet eine zusätzliche "denselben Wert" Zuordnung, wenn die globale bereits vorhanden sind und ich das gleiche Funktionen für übergebenen Parameter:

    Funktion doSomething (a) {
    a | | (a = "defaultValue");
    }

    gut, die Stimme verbreitet, was die richtige ...

    Kommentar von Diego Perini - 29. Januar 2010 #

  7. Aber die Sache, die mich schließlich überzeugt, dass die erste Form die am wenigsten schlechte ist, dass der IE kommt die zweite Form falsch, so dass verantwortungsvoll adaptive Programme scheitern

    Ich habe nicht in der Lage, alle Informationen über IE bekommt die zweite Form falsch finden.

    Persönlich habe ich mit:

    var fooObj;
    if (fooObj === undefined) {
    fooObj = {};
    }

    Kommentar von Jay in Oregon - 12. Juli 2010 #

  8. Verwenden Sie nicht die Methode in den oben genannten Artikel beschrieben wird, wenn Sie, was gut für Sie zu wissen. Ihr Code wird in ES-5 strikten Modus zu brechen.

    Neueste Version von ECMAScript - - Da Schwarzarbeit Aufgaben einer solchen irreführenden Teil der Sprache, ECMAScript 5 sind festgelegt, dass, wenn sie in einem strikten Modus auftreten, ein ReferenceError geworfen werden sollte. Dies führt zu robusteren Code mit weniger Chance für unerwartete Fehler. Und da der Strict-Modus ist mehr oder weniger eine künftige Ausrichtung der Sprache, macht es Sinn, Schwarzarbeit Zuweisungen zu vermeiden, als ob sie nie existiert.

    Kommentar von Zach Leatherman - 29. März 2011 #

  9. Ich empfehle nur die Funktion Form der strikten Modus Erklärung. Zach Kommentar bezieht sich nur auf die Datei zu bilden.

    Kommentar von Douglas Crockford - 29. März 2011 #

Sorry, das Kommentarformular ist zu dieser Zeit geschlossen.

Hosted by Yahoo!

Copyright © 2006-2011 Yahoo! Inc. Alle Rechte vorbehalten. Datenschutzbestimmungen - Nutzungsbedingungen

Präsentiert von WordPress auf Yahoo! Web Hosting .