'define' ใช้สำหรับอะไรใน JavaScript (นอกเหนือจากชัดเจน)


161

ฉันค้นหาเอกสารเกี่ยวกับเรื่องนี้สูงและต่ำ แต่ก็ไม่พบอะไรเลย

ฉันกำลังใช้ Aloha และต้องการใช้ต้นแบบแถบด้านข้างของพวกเขาเพื่อสร้างแถบด้านข้างใหม่ของฉันเองที่แนบมากับฟังก์ชั่นปลั๊กอินอื่น ๆ

sidebar.js ของพวกเขาเริ่มต้นด้วยสิ่งนี้ แต่ฉันไม่สามารถหาเอกสารที่อธิบายความหมายได้

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

จากนั้นมันก็จะปรากฏขึ้นใน wrapper นั้นเพื่อกำหนดฟังก์ชั่นมากมายvarsและบางอันproptotypes- ซึ่งฉันทำได้แค่เอาหัวไปรอบ ๆ ...

คำพูดนั้นหรือฉันจะหาคำอธิบายได้ที่ไหน


คำตอบ:


173

ฉันไม่สามารถพูดได้อย่างแน่นอนโดยไม่เห็นสคริปต์ทั้งหมด แต่เป็นไปได้ว่าเป็นdefineฟังก์ชันจาก RequireJSโดยเฉพาะอย่างยิ่งรูปแบบ " กำหนดด้วยการอ้างอิง " ของฟังก์ชันนั้น มันถูกใช้เพื่อกำหนด "โมดูล":

โมดูลแตกต่างจากไฟล์สคริปต์ดั้งเดิมที่กำหนดวัตถุที่มีการกำหนดขอบเขตอย่างดีเพื่อหลีกเลี่ยงการสร้างมลภาวะเนมสเปซส่วนกลาง มันสามารถแสดงรายการการขึ้นต่อกันของมันอย่างชัดเจนและรับการจัดการกับการพึ่งพาเหล่านั้นโดยไม่จำเป็นต้องอ้างถึงออบเจกต์ระดับโลก แต่ได้รับการขึ้นต่อกันเป็นอาร์กิวเมนต์ของฟังก์ชันที่กำหนดโมดูลแทน

และรูปแบบ "กำหนดด้วยการอ้างอิง" ของdefineถูกอธิบายดังนี้:

ถ้าโมดูลมีการขึ้นต่อกันอาร์กิวเมนต์แรกควรเป็นอาร์เรย์ของชื่อการพึ่งพาและอาร์กิวเมนต์ที่สองควรเป็นฟังก์ชันการกำหนด ฟังก์ชั่นจะถูกเรียกเพื่อกำหนดโมดูลเมื่อการอ้างอิงทั้งหมดได้โหลดแล้ว ฟังก์ชั่นควรกลับวัตถุที่กำหนดโมดูล


1
อ๋อครับแน่นอนทีเพื่อให้เป็นส่วนหนึ่งของการ require.js และใช้งานมาร์กอัปที่คุณต้องการrequirejs.org
เดวิดซัลลิแวน

4
และ IE เวอร์ชันใดไม่สนับสนุนสิ่งนี้ ... ;-)
Simon_Weaver

1
@Simon_Weaver - ไม่แน่ใจว่าสิ่งที่คุณหมายถึง ... RequireJS รับการสนับสนุนโดยIE6 +
James Allardice

เป็นเรื่องที่ดีที่จะรู้ว่า :) ฉันค่อนข้างขี้อาย แต่ฉันก็คิดว่านี่เป็นโครงสร้างที่ใหม่กว่า IE6
Simon_Weaver

1
@Simon_Weaver ไม่ใช่การสร้างภาษา Javascript เป็นฟังก์ชัน Javascript ธรรมดา วงเล็บเหลี่ยมสร้างอาร์เรย์ หรือว่าโครงสร้างที่คุณอ้างถึง?
Robin Green

3

นี่เป็นรูปแบบของ AMD สำหรับการเขียนโมดูลซึ่ง AMD ย่อมาจาก Asynchronous Module Definition เมื่อคุณต้องการนำเข้าโมดูล async โดยทั่วไปแทนที่จะเป็นอะไรที่เหมือนกับ commonJS

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

กำหนดใช้อาร์เรย์ของการอ้างอิงและเมื่อทั้งหมดถูกโหลดในพื้นหลัง (async) ในวิธีที่ไม่ปิดกั้นกำหนดโทรกลับซึ่งจะยอมรับการขัดแย้ง (ในกรณีนี้การอ้างอิง)

สิ่งที่ควรทราบอีกประการหนึ่งคือแต่ละโมดูลนั้นจำเป็นต้องกำหนดโดยใช้คำหลัก "define" ดังนั้นตัวอย่างเช่น module1 จะถูกกำหนดไว้ด้านล่าง:

define([], function() {

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

วิธีการเขียนโมดูล (AMD) นี้ช่วยให้คุณสามารถเขียนด้วยความเข้ากันได้ของเบราว์เซอร์ (ไม่ต้องใช้ () เช่นเดียวกับ nodeJS) และคุณสามารถกำหนดรูปแบบได้หลายรูปแบบรวมถึงวัตถุ JSON ฯลฯ ในขณะที่อินสแตนซ์

โปรดทราบว่า AMD มีความล้มเหลวของตัวเอง หวังว่านี่จะช่วยใครซักคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.