0

require()次のような関数で関数を使用できないのはなぜだろうと思っています。

// I'm using define's sugar syntax
define(function(require) {  

  // This works fine. It assigns myModule to the myModule variable (no callback needed)
  var myModule = require('myModule');

  var getModule = function(name) {

    // This doesn work. Using require() here expects a callback
    return require(name);        
  };

  return getModule;
});

その 2 番目require()の呼び出しがスローされます (ただし、DevTools を見ると、<name>実際に読み込まれていることがわかります)。

Uncaught Error: Module name <name> has not been loaded yet for context: _ 

最初のrequire()呼び出しはモジュールを返すだけで (コールバック方式で行う必要はありません)、2 番目のrequire()呼び出しはコールバックでのみ機能するのはなぜですか?

4

1 に答える 1

1

ここで私のコメントをフォローアップします。

渡されたdefineコールバックを除いrequireて、最初の引数として配列を渡さずに使用することはできません。そしてそれにも限界があります。require

他の場所でこれを行おうとすると、エラーがスローされます。

require('jquery', function() {});

http://requirejs.org/docs/errors.html#requireargs

あなたがそれを行うことができる唯一の時間はここにあります:

define(function(require) {
    var $ = require('jquery');
});

これはより良い書き方です:

define(['jquery'], function($) {

});

最初のバージョンはシュガー構文として知られています - http://requirejs.org/docs/whyamd.html#sugar

AMD ローダーは、Function.prototype.toString() を使用して require('') 呼び出しを解析し、上記の定義呼び出しを内部的に変換します。

基本的には、RequireJS のドキュメントで説明されていることを繰り返しただけですが、これで少しわかりやすくなれば幸いです。

このトピックについては、こちらの別のコンテキストでも説明しました - RequireJS で遅延読み込みを実現する方法は?

于 2013-03-26T19:57:46.407 に答える