通过添加自动标记库来了解meteorjs范围?

时间:2013-11-11 22:37:06

标签: javascript meteor closures scope

我正试图在流星中试验这个库 - https://code.google.com/p/autotags/。我正在努力弄清楚为什么事情确实发生了,哪些事情不起作用。

首先,当我尝试将所有单个javascript文件安装到客户端/兼容性文件夹时,从常量js文件调用AUTOTAGS时收到错误消息:

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

它一直说AUTOTAGS未定义。我从阅读全局范围中推断出任何具有VAR的外部库都要具有全局范围,并将其置于兼容性之下。

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

相反,我通过在lib / external下的一个单独的js文件中组合所有javascript文件来使范围工作。我以为我理解了,但情况变得更糟。

在单个js文件中 - 以闭包开头的任何函数都是该FILE的本地函数,而不是全局作用域,而赋给变量名的任何函数都使它成为全局变量?

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,这是真的吗?

如此困惑...... PS。 Javascript的新手,阅读它。提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

你得到这个"未定义的原因"错误不是范围问题,但它与文件加载到流星应用程序的顺序有某种关系。也就是说,autotags-js-constants.jsautotag-js-core.js之前,因为常量在字母顺序中位于核心之前。因此,AUTOTAGS变量未在解析autotags-js-constants.js文件时定义。

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

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