JavaScript中的“define”除了显而易见的用途之外还有什么用途?

169

我在各处搜寻有关这个的文档,但是就是找不到任何资料。

我正在使用Aloha,想使用他们的侧边栏原型来创建一个新的侧边栏,以便与其他插件功能相结合。

他们的sidebar.js从这里开始,但我找不到任何解释其含义的文档。

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

然后它在那个包装器中定义了一堆函数,像vars和一些proptotypes - 我大概能理解...

这是什么意思或者我可以在哪里找到解释?


https://github.com/alohaeditor/Aloha-Editor/blob/dev/src/lib/aloha/sidebar.js - David O'Sullivan
2个回答

181
我没有看到整个脚本,无法确定,但很可能是RequireJS的define函数, 特别是该函数的"define with dependencies"形式。它用于定义一个"模块":

模块与传统的脚本文件不同,它定义了一个良好作用域的对象,避免了全局命名空间的污染。它可以明确列出其依赖项并获取这些依赖项的句柄,而无需引用全局对象,而是将依赖项作为定义模块的函数的参数。

define的"define with dependencies"形式描述如下:

如果模块有依赖项,则第一个参数应该是依赖项名称的数组,第二个参数应该是定义函数。一旦所有依赖项都加载完成,就会调用该函数来定义模块。该函数应返回一个定义模块的对象。


1
没错,那绝对是这样的 - 所以它是 require.js 的一部分,要使用该标记,您需要访问 http://requirejs.org/。 - David O'Sullivan
5
哪些版本的IE不支持这个功能呢?;-) - Simon_Weaver
1
@Simon_Weaver - 不确定你的意思... RequireJS 被 IE6+ 支持。 - James Allardice
好的,知道了 :) 我有点挖苦,但我也认为这比IE6更新。 - Simon_Weaver
1
@Simon_Weaver 这不是JavaScript语言结构,而是普通的JavaScript函数。方括号创建一个数组。或者这就是你所指的结构吗? - Robin Green
发现 TinyMCE 使用的另一个实现:https://github.com/ephox/bolt - Bogdan

11

这是用于编写模块的 AMD 设计模式,其中 AMD 代表异步模块定义,用于在需要异步导入模块而不是像 CommonJS 那样时使用。

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

Define接受一个依赖项数组,一旦所有这些依赖项以非阻塞方式在后台异步加载,它调用回调函数,该回调函数接受参数(在本例中为依赖项)。

还有一件事需要注意的是,每个模块也需要使用“define”关键字进行定义。因此,例如,module1将像下面这样定义:

define([], function() {

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

这种编写模块的方式(AMD)使您能够考虑浏览器兼容性(不像在nodeJS中使用require()),同时您还可以定义许多格式,包括对象,JSON等,而例如commonJS需要将模块定义为对象。

请注意,AMD也有自己的缺点。希望这能对某个人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接