如何让跨多个文件的多个JavaScript对象访问同一个私有变量?

如何让跨多个文件的多个JavaScript对象访问同一个私有变量?,javascript,scope,Javascript,Scope,如果我想跨多个源文件跨JavaScript项目,但每个文件都可以访问同一个私有变量,那么如何实现呢 例如,如果我有以下代码: APP = (function () { var _secret = {}, app = {}; // Application part 01: app.part01 = (function () { /* function that uses _secret */ }()); // Application part 02:

如果我想跨多个源文件跨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.part01
app.part02
放在不同的文件中,但仍然可以访问_secret? 我不想把它当作论点。这只是泄露了秘密,因为
app.part01()
可以被任何其他函数替换

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


我想处理多个文件,但我不知道如何处理。每次测试前,我都不想复制和粘贴单个函数中的所有内容。

共享\u secret的唯一方法是将其附加到应用程序对象,然后将应用程序对象附加到窗口对象。这里有一个例子

//第一个JS文件。。。
var应用程序;//将被附加到窗口
(功能(应用程序){
app.secret=“blah!”//将附加到应用程序
})(应用程序| |(应用程序={}));
//另一个JS文件
var应用;
(功能(应用程序){
app.method1=function(){console.log(app.secret);};//将附加到应用程序;
})(应用程序| |(应用程序={}));
console.log(application.method1());//将显示“废话!”在控制台上
如何将app.part01和app.part02放在不同的文件中,但仍然可以访问
\u secret

那确实不可能。脚本文件在全局范围内执行,没有任何特权。他们将能够访问的所有变量对于所有其他脚本来说都是可访问的

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

您正在寻找的是一个自动构建脚本。您将能够对其进行配置,以便它将您的文件捆绑在一起,并将它们包装在IEFE中,它们将能够在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

实现这一点的一种方法是创建一个包含全局对象的JS文件

//定义一个包含所有环境和安全变量的全局对象
变量envGlobalObj={
appDatabase:process.env.YCAPPDATABASEURL,
sessionDatabase:process.env.YCSESSIONDATABASEURL,
secretPhrase:process.env.YCSECRETPHRASE,
appEmailAddress:process.env.YCAPPEMAILADDRESS,
appEmailPassword:process.env.YCAPPEMAILPASSWORD
}

module.exports=envGlobalObj
JS是否有私有变量?这是一个反问句……那我怎么称呼他们呢?局部变量?如果你是这个意思,听起来更可行。只是。。在创建对象时传递它们?或者如果有太多的间接寻址,将它们存储在对象可以访问的值存储中(通过require、import、全局名称空间、事件回调等等)?当您现在正在工作时,不可能在文件之间共享_secret,看看这个:没有附加到窗口的变量无法共享。你有一个闭包,所以_secret肯定不在窗口中。这不再是确切的秘密。如果它第一次在你的javascript上硬编码,它就不再是秘密了,但是,我理解你的意思。也许我应该用“隐藏”这个词。我想对应用程序之外的对象隐藏这个秘密。我不知道如何使用它,但也许我可以用PHP编写一些东西来将concat文件放在一起。这是一个简单的bash脚本,它读取文件
app.part01.js
app.part02.js
,并将输出写入
app.js
(或者至少应该这样做,我没有测试;但我希望你理解它的意思)。是的,你可以用任何你熟悉的语言编写构建脚本,也有(节点)基于js的工具,以及只需要一个配置文件就能自动完成所有工作的工具。