流星中的全局变量

Jam*_*een 28 javascript scope node.js meteor

我有

var Schemas = {};

Meteor.isClient && Template.registerHelper("Schemas", Schemas);

Schemas.Person = new SimpleSchema({
  fullName: {
    type: String,
    index: 1,
    optional: true,
  },
  email: {
    type: String,
    optional: true
  },
  address: {
    type: String,
    optional: true
  },
  isActive: {
    type: Boolean,
  },
  age: {
    type: Number,
    optional: true
  }
});
Run Code Online (Sandbox Code Playgroud)

在一个文件和

var Collections = {};

Meteor.isClient && Template.registerHelper("Collections", Collections);

Persons = Collections.Persons = new Mongo.Collection("Persons");
Persons.attachSchema(Schemas.Person);
Run Code Online (Sandbox Code Playgroud)

在另一个文件中.

我收到了错误ReferenceError: Schemas is not defined.很明显,我必须Schemas在我的collections.js文件中定义而不是将它们分开.但Meteor如何在单独的文件中使用代码?我可以访问一些对象和变量,而其他对象和变量是无法访问的.

Kyl*_*yll 57

以经典JavaScript方式定义变量时:

var someVar = 'someValue';
Run Code Online (Sandbox Code Playgroud)

在您的.js文件的根目录下,Meteor使用IIFE将其范围限定到文件.

如果要定义全局变量,只需不要编写var,给出:

someVar = 'someValue';
Run Code Online (Sandbox Code Playgroud)

这将定义默认情况下,所有的应用程序中的变量,虽然你可以通过写在该声明限制其特定的认可文件夹(clientserver文件夹为例).

但是,这个变量不会首先被绝对定义.它将在Meteor运行定义它的实际代码时定义.因此,它可能不是最好的做法,因为你将很难处理加载顺序,它会使你的代码依赖于Meteor如何加载文件:你把文件放在哪个文件夹,文件的名称......你的如果您稍微触摸您的架构,代码很容易出现混乱错误.

正如我在另一篇密切相关的帖子中建议的那样,你应该直接去找一个包!

  • 我想补充一点,这真的很酷,因为你的/ client可以有一个constants.js文件,而你的/ server目录中有另一个.如果你想在两者之间共享一个常量文件,你可以在/ lib/constants中创建它. (3认同)

Jos*_*eau 11

使用var关键字声明的Meteor中的变量的范围限定在它们声明的文件中.

如果要创建全局变量,请执行此操作

Schemas = {}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定我对此的感受...是否没有ES6/webpack风格的方式从另一个文件导入变量,以便我可以避免全局变量? (4认同)