Javascript 通过添加autotags库了解meteorjs范围?

Javascript 通过添加autotags库了解meteorjs范围?,javascript,meteor,closures,scope,Javascript,Meteor,Closures,Scope,我正在尝试[这个库](在《流星》中) 首先,当我试图将所有单独的javascript文件安装到client/compatibility文件夹时,从constants js文件调用AUTOTAGS时,我收到一条错误消息: AUTOTAGS = { ... } // autotags-js-core.js AUTOTAGS.TAG_CONSTANTS = [ 'news','research','favourite' ]; // autotags-js-constants.js 它一直说自动标签没

我正在尝试[这个库](在《流星》中)

首先,当我试图将所有单独的javascript文件安装到client/compatibility文件夹时,从constants js文件调用AUTOTAGS时,我收到一条错误消息:

AUTOTAGS = { ... } // autotags-js-core.js
AUTOTAGS.TAG_CONSTANTS = [ 'news','research','favourite' ]; // autotags-js-constants.js
它一直说自动标签没有定义。通过阅读有关全局作用域的内容,我推断出,任何带有VAR的外部库,如果希望具有全局作用域,请将其置于兼容性之下

如果这是正确的,那么为什么将所有单个文件放在lib/external下时作用域不是全局的呢?AUTOTAGS={..}不带var意味着它可用于整个应用程序,对吗

相反,我通过将所有javascript文件合并到lib/external下的一个js文件中,获得了工作范围。我以为我明白了,但情况变得更糟了

在单个js文件中-任何以闭包开头的函数都是该文件的局部函数,而不是全局范围,而任何分配给变量名的函数都使其成为全局变量

function(something() { ... } ) // closure, local
generateTags = function() { ... } // global scope?
var generateTags = function() { .... } // is this local or global? 

如果var generateTags函数是本地函数,那么将其置于client/compatibility下将使其成为全局函数?最后我得到一个模糊的概念,我应该在lib/environment.js下定义全局变量,从这里开始-,这是真的吗?

这里实际上有两个问题。一个是关于作用域如何在javascript中工作,另一个是关于将autotags库集成到meteor项目中。因为第一个问题的答案在其他地方应该比较容易找到,所以我只尝试回答第二个问题

您得到这个“未定义”错误的原因不是范围问题,但它与文件加载到meteor应用程序的顺序有关。也就是说,
autotags js constants.js
位于
autotag js core.js
之前,因为常量在core之前按字母顺序排列。因此,在解析
AUTOTAGS js constants.js
文件时,未定义
AUTOTAGS
变量

克服此问题的一个简单方法是重命名文件,以便强制执行正确的加载顺序。另一种方法是使用一种工具来定义文件之间的依赖关系。如果您感兴趣,请看一看project,它基本上是一个轻量级的、对流星友好的核心requirejs功能的实现

但是,最好的解决方案可能是创建自定义智能包。它允许您显式定义文件的加载顺序。只需看看一些现有的智能软件包,就可以了解如何实现这一点。我还建议使用来管理您的自定义智能软件包