【问题标题】:Understanding meteorjs scope by adding the autotags library?通过添加自动标签库来了解meteorjs 范围?
【发布时间】:2013-11-11 22:37:05
【问题描述】:

我正在尝试使用 [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,是这样吗?

【问题讨论】:

    标签: javascript meteor closures scope


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2011-06-27
      • 2016-02-12
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      相关资源
      最近更新 更多