0

我正在尝试使用 [this library](https://code.google.com/p/autotags/ in meteor)。

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

AUTOTAGS = { ... } // autotags-js-core.js
AUTOTAGS.TAG_CONSTANTS = [ 'news','research','favourite' ]; // autotags-js-constants.js

它一直说 AUTOTAGS 未定义。我从阅读有关全局范围的信息中推断出,任何带有 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 函数是本地的,那么将它放在客户端/兼容性下会使其成为全局吗?最后!- 我得到一个模糊的概念,我应该从这里定义 lib/environment.js 下的全局变量 - https://github.com/oortcloud/unofficial-meteor-faq#where-should-i-put-my-files是真的?

4

1 回答 1

0

这里实际上有两个问题。一个是关于范围如何在javascript中工作,另一个是关于将autotags库集成到一个流星项目中。由于第一个问题的答案在其他地方应该相对容易找到,所以我只尝试回答第二个问题。

您收到此“未定义”错误的原因不是范围问题,而是与文件加载到您的流星应用程序中的顺序有关。也就是说,在字母顺序中,常量在核心autotags-js-constants.js之前autotag-js-core.js是因为在前面。因此,在解析文件时未定义变量。AUTOTAGSautotags-js-constants.js

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

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

于 2013-11-12T00:23:06.227 回答