Wofür wird 'define' in JavaScript verwendet (abgesehen vom Offensichtlichen)?

161

Ich habe hoch und niedrig nach Dokumentation dazu gesucht, aber ich kann einfach nirgendwo etwas finden.

Ich verwende Aloha und möchte den Prototyp der Seitenleiste verwenden, um eine eigene neue Seitenleiste zu erstellen, die an andere Plugin-Funktionen angehängt ist.

Ihre sidebar.js beginnt damit, aber ich kann für mein ganzes Leben keine Dokumentation finden, die erklärt, was es bedeutet.

define( [
    'aloha/core',
    'aloha/jquery',
    'aloha/selection'
], function (Aloha, jQuery, Selection, Plugin) {

In diesem Wrapper geht es dann weiter, um eine Reihe von Funktionen zu definieren, also varseinige und einige proptotypes- die ich fast in den Griff bekommen kann ...

Was sagt das oder wo finde ich eine Erklärung?

David O'Sullivan
quelle

Antworten:

172

Ich kann nicht sicher sagen, ohne das gesamte Skript zu sehen, aber es ist wahrscheinlich die defineFunktion von RequireJS , insbesondere die Form " Mit Abhängigkeiten definieren " dieser Funktion. Es wird verwendet, um ein "Modul" zu definieren:

Ein Modul unterscheidet sich von einer herkömmlichen Skriptdatei darin, dass es ein Objekt mit einem guten Umfang definiert, das eine Verschmutzung des globalen Namespace vermeidet. Es kann seine Abhängigkeiten explizit auflisten und diese Abhängigkeiten behandeln, ohne auf globale Objekte verweisen zu müssen, sondern die Abhängigkeiten als Argumente für die Funktion empfangen, die das Modul definiert.

Die Form "Definieren mit Abhängigkeiten" definewird wie folgt beschrieben:

Wenn das Modul Abhängigkeiten aufweist, sollte das erste Argument ein Array von Abhängigkeitsnamen und das zweite Argument eine Definitionsfunktion sein. Die Funktion wird aufgerufen, um das Modul zu definieren, sobald alle Abhängigkeiten geladen wurden. Die Funktion sollte ein Objekt zurückgeben, das das Modul definiert.

James Allardice
quelle
1
yep das ist definitiv es - also ist es Teil von require.js und um dieses Markup zu verwenden, benötigen Sie requirejs.org
David O'Sullivan
4
und welche Versionen von IE unterstützen dies nicht ... ;-)
Simon_Weaver
1
@Simon_Weaver - Nicht sicher, was Sie meinen ... RequireJS wird von IE6 + unterstützt .
James Allardice
das ist gut zu wissen :) Ich war etwas scherzhaft, aber ich dachte auch, dass dies ein neueres Konstrukt als IE6 ist
Simon_Weaver
1
@Simon_Weaver Es ist kein Javascript-Sprachkonstrukt, sondern eine gewöhnliche Javascript-Funktion. Die eckigen Klammern erstellen ein Array. Oder ist das das Konstrukt, auf das Sie sich bezogen haben?
Robin Green
3

Dies ist ein AMD-Muster zum Schreiben von Modulen, für das AMD für Asynchronous Module Definition steht, wenn Sie Module grundsätzlich asynchron importieren müssen und nicht so etwas wie commonJS.

define(['module1', 'module2'], function(module1, module2) {
  console.log(module1.sayHi());
});

Define verwendet ein Array von Abhängigkeiten. Wenn alle diese nicht blockierend im Hintergrund (asynchron) geladen sind, ruft define den Rückruf auf, der wiederum Argumente akzeptiert (in diesem Fall die Abhängigkeiten).

Beachten Sie außerdem, dass jedes dieser Module auch mit dem Schlüsselwort "define" definiert werden muss. So würde beispielsweise Modul1 wie folgt definiert:

define([], function() {

  return {
    sayHi: function() {
      console.log('Hi Hi');
    },
  };
});

Diese Art des Schreibens von Modulen (AMD) ermöglicht es Ihnen, unter Berücksichtigung der Browserkompatibilität zu schreiben (no require () wie in nodeJS) und Sie können auch viele Formate definieren, einschließlich Objekte, JSON usw., während beispielsweise commonJS Module als Objekte benötigt.

Denken Sie daran, AMD hat seine eigenen Nachteile. Hoffe das hilft jemandem.

TheeBen
quelle