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

时间:2014-03-20 14:30:22

标签: javascript oop scope javascript-objects

我想知道是否可以在两个单独的javascript文件之间使用共享范围的变量,但不能在引用这些javascript文件的根文档中。

例如,如果我想在页面加载时拥有一个包含html元素大小信息的变量,我可以这样做......

在root(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) { ... }

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

某些可能性已经来到我身边,但它们似乎都在某个时刻崩溃了:

  1. 在两个.js文件中的一个中声明变量将限制 它的范围只适用于该文件。这只是行不通。
  2. 将变量存储为根目录中声明的对象的私有属性,并允许仅通过已批准的.js文件设置/获取该属性
    • 这可以通过在外部.js文件中扩展祖先对象的原型来包含getter / setter方法,但不在文档根目录中提供这些方法(这是祖先必须声明的地方)< / LI>
    • 我不是OOP专家,所以这种方法可能存在根本缺陷。请随意纠正我!
  3. 将两个javascript文件合并为一个,然后声明 该脚本中的变量。这可行,但我可能不会 必然想要或能够合并单独的.js文件 在某些情况下。
  4. 除此之外,我对这个问题感到困惑。在这个时候,我没有特定的理由需要这个功能,但我可以想象它在某些情况下是有用的(即额外的安全性,隔离变量值),当然,我很好奇,想要学习一些东西关于JS&amp; amp;通过这个例子OOP。

    也许这在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不是我的强项,所以这可能很容易被驳回,因为不可能或不正确。如果是这样,请解释原因。

2 个答案:

答案 0 :(得分:4)

最终,您无法做任何事情来使符号完全专用于从单独的<script>块导入的两个代码单元。这些代码可以拥有的唯一关系是通过全局符号,如果两个脚本中的代码可以找到你的&#34;私有&#34;属性,任何其他代码也可以。

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

答案 1 :(得分:3)

在你的情况下,它将它包装成像$.fn.methodName = function { var leaveMeAlone = true; };

这样的jQuery方法