Untuk apa 'define' digunakan dalam JavaScript (selain dari yang sudah jelas)?

161

Saya telah mencari tinggi dan rendah untuk dokumentasi tentang ini, tetapi saya tidak dapat menemukan apa pun di mana pun.

Saya menggunakan Aloha dan ingin menggunakan prototipe bilah samping mereka untuk membuat bilah samping baru saya sendiri yang terlampir pada fungsi plugin lainnya.

Sidebar.js mereka dimulai dengan ini, tapi aku tidak bisa seumur hidup menemukan dokumentasi yang menjelaskan apa artinya.

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

Kemudian berjalan dalam pembungkus itu untuk mendefinisikan banyak fungsi, jadi varsdan beberapa proptotypes- yang saya bisa tentang ...

Apa yang dikatakan atau di mana saya dapat menemukan penjelasan?

David O'Sullivan
sumber

Jawaban:

173

Saya tidak bisa mengatakan dengan pasti tanpa melihat seluruh skrip, tetapi kemungkinan itu adalah definefungsi dari RequireJS , khususnya bentuk " define with dependencies " dari fungsi itu. Ini digunakan untuk mendefinisikan "modul":

Modul berbeda dari file skrip tradisional karena mendefinisikan objek dengan cakupan yang baik yang menghindari polusi namespace global. Itu dapat secara eksplisit daftar dependensinya dan mendapatkan pegangan pada dependensi itu tanpa perlu merujuk ke objek global, tetapi sebaliknya menerima dependensi sebagai argumen untuk fungsi yang mendefinisikan modul.

Dan bentuk "define with dependencies" definedijelaskan sebagai berikut:

Jika modul memiliki dependensi, argumen pertama harus berupa array nama dependensi, dan argumen kedua harus berupa fungsi definisi. Fungsi akan dipanggil untuk mendefinisikan modul setelah semua dependensi dimuat. Fungsi harus mengembalikan objek yang mendefinisikan modul.

James Allardice
sumber
1
ya itu pasti itu- jadi itu bagian dari require.js dan untuk menggunakan markup itu Anda memerlukan requireejs.org
David O'Sullivan
4
dan versi IE mana yang tidak mendukung ini ... ;-)
Simon_Weaver
1
@Simon_Weaver - Tidak yakin apa yang Anda maksud ... RequireJS didukung oleh IE6 + .
James Allardice
itu bagus untuk diketahui :) Saya menjadi agak jenaka, tapi saya juga berpikir ini adalah konstruksi yang lebih baru daripada IE6
Simon_Weaver
1
@Simon_Weaver Ini bukan konstruksi bahasa Javascript, ini adalah fungsi Javascript biasa. Kurung kotak membuat array. Atau apakah itu konstruksi yang Anda maksud?
Robin Green
3

Ini adalah pola AMD untuk menulis modul yang merupakan kepanjangan dari AMD Asynchronous Module Definition ketika Anda perlu mengimpor modul async pada dasarnya daripada sesuatu seperti commonJS.

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

Tentukan mengambil array dependensi dan setelah semua dimuat di latar belakang (async) dengan cara non-blocking, tentukan panggilan callback yang pada gilirannya menerima argumen (dalam hal ini dependensi).

Satu hal yang perlu diperhatikan adalah bahwa masing-masing modul tersebut juga perlu didefinisikan menggunakan kata kunci "define". Jadi misalnya module1 akan didefinisikan seperti di bawah ini:

define([], function() {

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

Modul penulisan ini (AMD) memungkinkan Anda untuk menulis dengan kompatibilitas browser dalam pikiran (tidak perlu () seperti di nodeJS) dan Anda juga dapat mendefinisikan banyak format termasuk objek, JSON, dll. Sebagai contoh, commonJS membutuhkan modul untuk menjadi objek.

Perlu diingat, AMD memiliki kekurangan itu sendiri. Semoga ini bisa membantu seseorang.

TheeBen
sumber