Underscorejs与requirejs一起使用时返回undefined

时间:2015-09-01 01:41:47

标签: javascript requirejs underscore.js

我正在使用requirejs,在我的一个文件中,下划线是一个依赖项。以下是包含下划线的代码段。

define(["lib/underscore"], function(_) {
    // Here _ is undefined
});

通过一些研究,我发现下划线是将它添加到全局命名空间。 Underscore返回undefined,这就是为什么_变得未定义。如果我使用以下方式_有效。

define(["lib/underscore"], function() {
    // Here _ is defined
};

在上面的代码中,我没有覆盖添加到全局名称空间的_。

在我的探索中找出为什么下划线没有返回_我在underscore.js中找到了以下代码

// AMD registration happens at the end for compatibility with AMD loaders
  // that may not enforce next-turn semantics on modules. Even though general
  // practice for AMD registration is to be anonymous, underscore registers
  // as a named module because, like jQuery, it is a base library that is
  // popular enough to be bundled in a third party lib, but not be part of
  // an AMD load request. Those cases could generate an error when an
  // anonymous define() is called outside of a loader request.
  if (typeof define === 'function' && define.amd) {
    define('underscore', [], function() {
      return _;
    });
  }

这意味着当通过requirejs加载下划线时,它应该返回_而不是undefined。它不会发生在我身上。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:0)

您在上面提供的下划线代码段仅在define存在时运行。您可能在RequireJS之前在页面上加载下划线。此外,下划线将自己注册为命名模块。通常需要使用该名称来命名模块,而不是路径。

你可以:

  • 如果您需要将下划线作为常规全局,请在之后加载下划线,然后在页面上加载RequireJS。这样,它将自己声明为全局模块和命名模块。然后,您可以使用其名称而不是像define(['underscore'], function(_){...});

  • 这样的路径来要求下划线
  • 不要求使用下划线并继续使用全局_。但这首先击败了你有RequireJS的目的。