Для чего используется «определение» в JavaScript (кроме очевидного)?


161

Я искал документацию по этому вопросу, но просто нигде не могу ничего найти.

Я использую Aloha и хочу использовать их прототип боковой панели для создания новой собственной боковой панели, присоединенной к другим функциям плагина.

Их sidebar.js начинается с этого, но я не могу найти документацию, которая объясняет, что это значит.

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

Затем в этой оболочке происходит определение набора функций, поэтому varsи некоторыеproptotypes - которые я могу просто обдумать ...

Что это за высказывание или где я могу найти объяснение?


Ответы:


173

Я не могу сказать наверняка, не увидев весь скрипт, но, скорее всего, это будет defineфункция из RequireJS , в частности, форма « определим с зависимостями » этой функции. Он используется для определения «модуля»:

Модуль отличается от традиционного файла сценария тем, что он определяет объект с хорошей областью действия, который предотвращает загрязнение глобального пространства имен. Он может явно перечислить свои зависимости и получить указатель на эти зависимости без необходимости ссылаться на глобальные объекты, но вместо этого получать зависимости в качестве аргументов функции, которая определяет модуль.

И форма «определить с зависимостями» defineописывается следующим образом:

Если модуль имеет зависимости, первый аргумент должен быть массивом имен зависимостей, а второй аргумент должен быть функцией определения. Функция будет вызываться для определения модуля после загрузки всех зависимостей. Функция должна возвращать объект, который определяет модуль.


1
да, это определенно так, поэтому он является частью require.js и для использования этой разметки вам нужен requirejs.org
Дэвид О'Салливан

4
и какие версии IE не поддерживают это ... ;-)
Simon_Weaver

1
@Simon_Weaver - Не уверен, что вы имеете в виду ... RequireJS поддерживается IE6 + .
Джеймс Аллардис

это приятно знать :) Я был немного шутлив, но я также подумал, что это более новая конструкция, чем IE6
Simon_Weaver

1
@Simon_Weaver Это не языковая конструкция Javascript, это обычная функция Javascript. Квадратные скобки создают массив. Или это та конструкция, на которую вы ссылались?
Робин Грин

3

Это паттерн AMD для написания модулей, который AMD обозначает Asynchronous Module Definition, когда вам нужно импортировать модули асинхронно, а не как обычныйJS.

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

Define принимает массив зависимостей, и как только все они загружаются в фоновом режиме (асинхронно) неблокирующим способом, define вызывает callback, который, в свою очередь, принимает аргументы (в данном случае зависимости).

Следует также отметить, что каждый из этих модулей также должен быть определен с помощью ключевого слова define. Так, например, module1 будет определен так:

define([], function() {

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

Этот способ написания модулей (AMD) позволяет вам писать с учетом совместимости браузера (без require (), как в nodeJS), а также вы можете определять множество форматов, включая объекты, JSON и т. Д., В то время как, например, commonJS требует, чтобы модули были объектами.

Имейте в виду, у AMD есть свои недостатки. Надеюсь, это кому-нибудь поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.