如何在多个文件中为多个JavaScript对象提供对同一私有变量的访问权限?

时间:2016-02-20 22:07:47

标签: javascript scope

如果我想在多个源文件中跨越我的JavaScript项目,但让每个文件都可以访问同一个私有变量,那么如何做到这一点呢?

例如,如果我有以下代码:

APP = (function () {
    var _secret = {},
        app = {};
    // Application part 01:
    app.part01 = (function () { /* function that uses _secret */ }());
    // Application part 02:
    app.part02 = (function () { /* function that uses _secret */ }());
    //
    return app;
}());

如何将app.part01app.part02放在单独的文件中,但仍然可以访问_secret? 我不想把它作为论据传递。这只是给予秘密,因为app.part01()可以被任何其他功能取代。

也许我在问不可能,但你的建议可能会以正确的方式引导我。

我想处理多个文件,但我不知道如何处理。每次在测试之前复制并粘贴一个函数内的所有内容都不是我想做的事情。

3 个答案:

答案 0 :(得分:2)

  

如何将app.part01和app.part02放在单独的文件中,但仍然可以访问_secret

这确实是不可能的。脚本文件在全局范围内执行,并且没有任何特殊权限。他们能够访问的所有变量都可以被所有其他脚本访问。

  

每次在测试之前复制并粘贴单个函数内的所有内容都不是我想做的事情

您正在寻找的是一个自动构建脚本。您将能够对其进行配置,以便将文件捆绑在一起,并将它们包装在IEFE中,在其范围内,它们将能够共享其私有状态。最简单的例子:

#!/bin/sh
echo "APP = (function () {
    var _secret = {},
        app = {};" > app.js
cat app.part01.js >> app.js
cat app.part02.js >> app.js
echo "    return app;
}());" >> app.js

答案 1 :(得分:0)

您可以共享 _secret 的唯一方法是将其附加到应用程序对象,然后将应用程序对象附加到窗口对象。这是一个例子。

// FIRST JS FILE...
var application; // will be attached to window

(function(app) {
  
  app.secret = "blah!"; // will be attached to application
  
})(application || (application = {}));



// ANOTHER JS FILE
var application;

(function(app) {
  
  app.method1 = function(){ console.log(app.secret); }; // will be attached to application;
  
})(application || (application = {}));
  
console.log(application.method1()); // will display 'blah!' on the console

jsbin上的工作示例

答案 2 :(得分:0)

我能够实现这一目标的一种方法是创建一个包含全局对象的JS文件。

// Define a global object to contain all environment and security variables

   var envGlobalObj = {
      appDatabase:      process.env.YCAPPDATABASEURL,
      sessionDatabase:  process.env.YCSESSIONDATABASEURL,
      secretPhrase:     process.env.YCSECRETPHRASE,
      appEmailAddress:  process.env.YCAPPEMAILADDRESS,
      appEmailPassword: process.env.YCAPPEMAILPASSWORD
   }
 module.exports = envGlobalObj

然后在我希望引用此对象的文件中,我添加了一个require语句。

 var envGlobalObj = require("./envGlobalObj.js");

这使我能够集中环境并分泌变量。