code: function define() {
          var argsLen = arguments.length;
          if ( !argsLen ) {
              return;
          }
  
          var id;
          var dependencies;
          var factory = arguments[ --argsLen ];
  
          while ( argsLen-- ) {
              var arg = arguments[ argsLen ];
  
              if ( typeof arg === 'string' ) {
                  id = arg;
              }
              else if ( isArray( arg ) ) {
                  dependencies = arg;
              }
          }
  
          // 出现window不是疏忽
          // esl设计是做为browser端的loader
          // 闭包的global更多意义在于：
          //     define和require方法可以被挂到用户自定义对象中
          var opera = window.opera;
  
          // IE下通过current script的data-require-id获取当前id
          if (
              !id
              && document.attachEvent
              && (!(opera && opera.toString() === '[object Opera]'))
          ) {
              var currentScript = getCurrentScript();
              id = currentScript && currentScript.getAttribute('data-require-id');
          }
  
          if ( id ) {
              modPreDefine( id, dependencies, factory );
  
              // 在不远的未来尝试完成define
              // define可能是在页面中某个地方调用，不一定是在独立的文件被require装载
              if ( tryDefineTimeout ) {
                  clearTimeout( tryDefineTimeout );
              }
              tryDefineTimeout = setTimeout( modAnalyse, 1 );
          }
          else {
              // 纪录到共享变量中，在load或readystatechange中处理
              // 标准浏览器下，使用匿名define时，将进入这个分支
              wait4PreDefines.push( {
                  deps    : dependencies,
                  factory : factory
              } );
          }
      }
docs: 定义模块
  
  @param {string=} id 模块标识
  @param {Array=} dependencies 依赖模块列表
  @param {Function=} factory 创建模块的工厂方法