我正在使用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。它不会发生在我身上。任何人都可以帮助我。
答案 0 :(得分:0)
您在上面提供的下划线代码段仅在define
存在时运行。您可能在RequireJS之前在页面上加载下划线。此外,下划线将自己注册为命名模块。通常需要使用该名称来命名模块,而不是路径。
你可以:
如果您需要将下划线作为常规全局,请在之后加载下划线,然后在页面上加载RequireJS。这样,它将自己声明为全局模块和命名模块。然后,您可以使用其名称而不是像define(['underscore'], function(_){...});
不要求使用下划线并继续使用全局_
。但这首先击败了你有RequireJS的目的。