A cosa serve 'define' usato in JavaScript (a parte l'ovvio)?


161

Ho cercato in alto e in basso la documentazione su questo, ma non riesco a trovare nulla da nessuna parte.

Sto usando Aloha e desidero utilizzare il prototipo della barra laterale per creare una nuova barra laterale collegata ad altre funzionalità del plug-in.

Il loro sidebar.js inizia con questo, ma per la vita non riesco a trovare alcuna documentazione che spieghi cosa significhi.

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

Dopodiché prosegue in quel wrapper per definire un mucchio di funzioni, quindi varse alcune proptotypes- di cui posso quasi girare la testa ...

Cosa sta dicendo questo o dove posso trovare una spiegazione?


Risposte:


173

Non posso dire con certezza senza vedere l'intero script, ma è probabile che sia la definefunzione di RequireJS , in particolare la forma " Definisci con dipendenze " di quella funzione. Viene utilizzato per definire un "modulo":

Un modulo è diverso da un file di script tradizionale in quanto definisce un oggetto ben definito che evita di inquinare lo spazio dei nomi globale. Può elencare esplicitamente le sue dipendenze e ottenere un handle su tali dipendenze senza dover fare riferimento a oggetti globali, ma invece ricevere le dipendenze come argomenti per la funzione che definisce il modulo.

E la forma "Definisci con dipendenze" defineè descritta come segue:

Se il modulo ha dipendenze, il primo argomento dovrebbe essere una matrice di nomi di dipendenza e il secondo argomento dovrebbe essere una funzione di definizione. La funzione verrà chiamata per definire il modulo una volta caricate tutte le dipendenze. La funzione dovrebbe restituire un oggetto che definisce il modulo.


1
sì, è decisamente così, quindi fa parte di require.js e per usare quel markup è necessario requestjs.org
David O'Sullivan,

4
e quali versioni di IE non supportano questo ... ;-)
Simon_Weaver

1
@Simon_Weaver - Non sono sicuro di cosa intendi ... RequireJS è supportato da IE6 + .
James Allardice,

buono a sapersi :) Ero un po 'faceto, ma pensavo anche che fosse un costrutto più recente di IE6
Simon_Weaver,

1
@Simon_Weaver Non è un costrutto in linguaggio Javascript, è una normale funzione Javascript. Le parentesi quadre creano un array. O è questo il costrutto a cui ti riferivi?
Robin Green,

3

Questo è il modello AMD per la scrittura di moduli che AMD sta per Asynchronous Module Definition per quando è necessario importare i moduli in modo asincrono piuttosto che qualcosa come commonJS.

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

Definisci accetta una matrice di dipendenze e una volta caricate tutte in background (asincrone) in modo non bloccante, definisce le chiamate del callback che a sua volta accetta gli argomenti (in questo caso le dipendenze).

Un'altra cosa da notare è che ognuno di quei moduli deve anche essere definito usando la parola chiave "define". Quindi, ad esempio, module1 sarebbe definito come di seguito:

define([], function() {

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

Questo modo di scrivere moduli (AMD) ti consente di scrivere tenendo presente la compatibilità del browser (non è necessario () come in nodeJS) e puoi anche definire molti formati tra cui oggetti, JSON, ecc. Mentre CommonJS, ad esempio, ha bisogno che i moduli siano oggetti.

Tieni presente che AMD ha le sue cadute. Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.