根据我的经验,大多数JS函数,构造函数或模块模式函数都被声明为全局变量或绑定到全局命名空间对象。无论如何,这些标识符是全局可访问的。
您可以从系统中的任何代码行:
mod1 = somepackage.SomeModule(); // couple to me!
这是一个简单的JS示例,但在其他语言中,这个想法适用。
function A () { // couple to me!
return { foo: "bar" };
};
(function () {
function B () { // don't couple to me!
function c () { // really don't couple to me!
return "buzz";
};
return { fizz: c() }; // 0 scope lookup
};
var a = A(); // 1 scope lookup
var b = B(); // 0 scope lookup
})();
var a1 = A(); // 0 scope lookup
var b1 = B(); // B is not defined
由于全局变量被认为是有害的,所以应该限制函数/类的可见性多少?有什么权衡?
我的问题有点动机: “when are globals acceptable”,“alternatives to globals”和“return of the globals”
谢谢!
答案 0 :(得分:2)
最好从最小范围开始,如果有要求,可以增加范围。但是如果你在第一时间保持公开,那么最小化范围真的很难(几乎不可能),因为你必须在这个过程中重构/修复其他代码。
这是设计API时的主要内容之一。
同样保持最小范围也是一个很好的设计决策。这样您就可以管理类的用法。例如,在工厂模式的情况下,您将构造函数的作用域保持为默认值,以便只有该特定包中的代码(即您的工厂类实现)才能创建该对象,而其他包不能。