限制共享变量的作用域(Javascript)
Limiting the scope of a shared variable (Javascript)
我想知道是否有可能在两个单独的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)。
我想到了一些可能性,但它们似乎都在某一点上崩溃了:
- 在两个.js文件中的一个声明变量会限制它的范围仅限于该文档。这是行不通的。
- 将变量存储为在根目录中声明的对象的私有属性,并且只允许被批准的.js文件设置/获取该属性
- 这可以通过在外部.js文件中扩展祖先对象的原型来包括getter/setter方法,但不在文档根目录中提供这些方法(这是必须声明祖先的地方) 我不是OOP专家,所以这种方法可能从根本上有缺陷。请随时纠正我的错误!
- 将两个javascript文件合并为一个,并声明变量。这可能有用,但我可能不行必须希望或能够合并独立的.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; };
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- Javascript作用域和Ajax调用;工作不正常
- switch语句中的Javascript作用域
- JavaScript作用域:如何创建具有不同值的匿名函数
- Javascript作用域规则和mongo-map/reduce函数
- Javascript作用域问题,对象在分配后没有数据
- 可能存在Javascript作用域问题
- 本地Javascript作用域问题
- 从另一个文件调用时出现Javascript作用域错误
- JavaScript 作用域和 Angular JS 作用域之间的区别是什么?
- JavaScript 作用域:在函数后保留全局变量值
- Javascript:作用域链/变量查找性能
- ES6中的JavaScript作用域已转换
- Javascript作用域意外结果
- 订阅服务器模式中的Javascript作用域
- 了解Javascript作用域和变量
- 绑定时出现Javascript作用域问题
- Javascript作用域链式吊装
- javascript作用域和jquery's$(文档).准备好了
- Javascript作用域问题:函数在$(doc).ready()中可用,但在事件处理程序中不可用