限制共享变量的作用域(Javascript)

Limiting the scope of a shared variable (Javascript)

本文关键字:Javascript 作用域 共享变量      更新时间:2023-09-26

我想知道是否有可能在两个单独的javascript文件之间具有共享作用域的变量,但不在引用这些javascript文件的根文档内。

例如,如果我想有一个变量来保存关于页面加载时html元素大小的信息,我可以这样做…

在根(index.html)文档中,我可以声明变量并给它一个全局作用域:

<script>
  var elemWidth;
</script>
<script src="first.js"></script>
<script src="second.js"></script>

在第一个javascript文件(first.js)中:

var elem = document.getElementById('myElem');
elemWidth = elem.style.width;

在附加的javascript文件(second.js)中:

var someDynamicValue = n; /* where 'n' is an integer that is given a calculated value */
if(elemWidth > someDynamicValue) { ... }

使用上述约定,变量elemWidth可以在所有三个文档(index.html、first.js、second.js)中访问。但是,如果出于某种原因,我不希望在根文档(index.html)中访问该变量,该怎么办?我只希望它在两个.js文件中是可访问和可操作的。毕竟,在根文档(index.html)中确实不需要它,我也不一定需要它在其他.js文件中(例如third.js)。

我想到了一些可能性,但它们似乎都在某一点上崩溃了:

  1. 在两个.js文件中的一个声明变量会限制它的范围仅限于该文档。这是行不通的。
  2. 将变量存储为在根目录中声明的对象的私有属性,并且只允许被批准的.js文件设置/获取该属性
    • 这可以通过在外部.js文件中扩展祖先对象的原型来包括getter/setter方法,但不在文档根目录中提供这些方法(这是必须声明祖先的地方)
    • 我不是OOP专家,所以这种方法可能从根本上有缺陷。请随时纠正我的错误!
  3. 将两个javascript文件合并为一个,并声明变量。这可能有用,但我可能不行必须希望或能够合并独立的.js文件
除此之外,我被这个问题难住了。在这个时候,我没有一个具体的理由需要这个功能,但我可以想象它在某些情况下是有用的(即额外的安全性,隔离变量值),当然,我很好奇,想要学习一些关于JS的新东西。

也许这在JavaScript中是不可能的-如果是,请解释为什么:)


更新:我想扩展使用对象原型继承的想法来可能实现这个结果。如果声明一个类构造函数,如:

function ancestorObj() {
  var privateVar = 'secret';
}

然后用另一个构造函数扩展这个原型:

function inheritedObj() {
  this.getSecret = function() {
    return privateVar;
  }
}
inheritedObj.prototype = new ancestorObj();

我们现在已经创建了一个对象类构造函数,它是ancestorObj的一个继承实例,它包含一个getter方法,返回原型对象的私有属性。默认的类构造函数不包含getter方法。接下来的逻辑是,只有inheritedObj的实例才能获得这个私有属性的值。难道我们不能只在需要的地方声明inheritedObj的实例吗?'first.js'和'second.js'),从而限制privateVar属性的范围?

再次强调,OOP不是我的强项,所以这很容易被认为不可能或不正确。如果有,请解释原因。

最终,您无法使符号完全私有于从单独的<script>块导入的两个代码单元。这样的代码之间唯一的关系是通过全局符号,如果两个脚本中的代码都能找到你的"私有"属性,那么其他代码也可以。

可能最好的做法是将其保留为您声明的某个全局命名空间的属性,或者在您已经使用的名称空间(如框架)下。

在您的例子中,它会将其封装到像$.fn.methodName = function { var leaveMeAlone = true; };

这样的jQuery方法中