2015-09-01 26 views
0

我正在使用requirejs,并且在我的一个文件中,下划线是依赖项。下面是包含下划线的一段代码。Underscorejs与requirejs一起使用时返回undefined

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它应该返回加载它意味着这下面的一段代码_,而不是不确定的。这不会发生在我身上。任何人都可以帮助我这个。

回答

0

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

您可以:

  • 如果您需要强调作为一个经常性的全球,负荷强调加载页面上RequireJS。这样,它就宣布自己是一个全局以及一个命名模块。然后,您可以使用名称而不是像下面这样的路径来要求下划线:define(['underscore'], function(_){...});

  • 不要求下划线并继续使用全局_。但是这首先破坏了你拥有RequireJS的目的。

+0

1.当下划线被调用时,define存在,我在下划线之前加载RequireJS。 2.路径也是正确的我能够调试到我上面指定的代码。 – kishore

+0

@kishore Underscore将自己注册为*一个已命名的模块*。这意味着*应该按名称引用,而不是路径*引用。我答案中的第一个重点应该解决这个问题。 – Joseph

+0

所以我必须在requirejs config中定义一个路径 – kishore

相关问题