gpt4 book ai didi

javascript - 限制共享变量的范围 (Javascript)

转载 作者:行者123 更新时间:2023-11-30 07:38:57 25 4
gpt4 key购买 nike

我想知道是否有可能在两个单独的 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. 将变量存储为在根中声明的对象的私有(private)属性,并只允许通过批准的 .js 文件设置/获取该属性
    • 这可以通过在外部 .js 文件中扩展祖先对象的原型(prototype)以包含 getter/setter 方法来实现,但不在文档根目录中提供这些方法(这是必须声明祖先的地方)
    • 我不是 OOP 专家,因此这种方法可能存在根本性缺陷。请随时纠正我!
  3. 将两个 javascript 文件合并为一个,并声明该脚本中的变量。这会起作用,但我可能不会一定想要或能够合并单独的 .js 文件在某些情况下。

除此之外,我被这个问题难住了。目前,我没有特定的理由需要此功能,但我可以想象它在某些情况下很有用(即额外的安全性、隔离变量值),当然,我很好奇并想学习一些东西通过这个例子了解 JS 和 OOP。

也许这在 JavaScript 中是不可能的 - 如果是这样,请解释原因 :)


更新:我想扩展使用对象原型(prototype)继承来可能实现此结果的想法。如果我们声明一个类的构造器,比如:

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

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

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

inheritedObj.prototype = new ancestorObj();

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

同样,OOP 不是我的强项,所以这可能很容易被认为不可能或不正确而被驳回。如果是,请解释原因。

最佳答案

最终,您无能为力使符号对从单独的 <script> 导入的两个代码单元完全私有(private)。 block 。此类代码唯一可以拥有的关系是通过全局符号,如果两个脚本中的代码可以找到您的“私有(private)”属性,那么任何其他代码也可以。

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

关于javascript - 限制共享变量的范围 (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22536065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com