【问题标题】:How do I give multiple JavaScript objects across multiple files access to same private variable?如何让多个文件中的多个 JavaScript 对象访问同一个私有变量?
【发布时间】:2016-02-20 22:07:46
【问题描述】:

如果我想将我的 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() 可以被任何其他函数替换。

也许我问的是不可能的事,但你的建议可能会引导我走上正确的道路。

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

【问题讨论】:

  • JS有私有变量吗?这是一个反问...
  • 那我怎么称呼他们呢?局部变量?
  • 如果这就是你的意思,听起来更可行。
  • 只是 .. 在创建对象时传递它们?或者,如果间接性太多,将它们存储在对象可以访问的值存储中(通过要求、导入、全局命名空间、事件回调等)?
  • 由于您现在正在工作,无法在文件之间共享_secret,请看:未附加到窗口的变量,无法共享。而且你有一个闭包,所以 _secret 肯定不在窗口。

标签: javascript scope


【解决方案1】:

如何将 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

【讨论】:

  • 我不明白如何使用它,但也许我可以用 PHP 编写一些东西来将文件连接在一起。
  • 这是一个简单的 bash 脚本,它读取文件 app.part01.jsapp.part02.js 并将输出写入 app.js(或者至少应该这样做,我没有测试;但我希望你明白它的意思)。是的,您可以用任何您熟悉的语言编写构建脚本,也有基于(节点)js 的工具以及只需要配置文件并自动完成所有操作的工具。
【解决方案2】:

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

// 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 上的工作示例

【讨论】:

  • 这已经不是什么秘密了。
  • 如果一开始就在你的 javascript 上硬编码,这已经不是什么秘密了,但是,我理解你的意思。
  • 也许我应该习惯使用“隐藏”这个词。我想让 _secret 对应用程序外部的对象隐藏。
【解决方案3】:

我能够做到这一点的一种方法是创建一个包含全局对象的 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");

这让我可以集中环境和秘密变量。

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 2015-03-11
    • 2019-04-11
    • 2015-06-06
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多