在JavaScript中使用全局引用是一种好的做法吗?
例如,javascript代码是:在JavaScript中使用全局引用是一种好的做法吗?,javascript,Javascript,例如,javascript代码是: function a() { this.Foo = function() {//...} } 我通常会创建一个全局引用: _a = new a(); 然后在正文或其他脚本区域的任何位置使用它: _a.Foo() 这是好的还是坏的做法?或者有更好/更专业的方法来做到这一点吗?一般来说,Javascript开发人员会尽量避免这种情况,因为不同的库可能在全局范围内相互冲突。为了避免这一点,考虑(如果可能的话)使用所谓的闭包来为变量创建一个私有范
function a() {
this.Foo = function() {//...}
}
我通常会创建一个全局引用:
_a = new a();
然后在正文或其他脚本区域的任何位置使用它:
_a.Foo()
这是好的还是坏的做法?或者有更好/更专业的方法来做到这一点吗?一般来说,Javascript开发人员会尽量避免这种情况,因为不同的库可能在全局范围内相互冲突。为了避免这一点,考虑(如果可能的话)使用所谓的闭包来为变量创建一个私有范围。看起来是这样的:
(function() {
_a = new a();
})();
内部函数中声明的所有内容对于外部代码都是不可见的
如果出于任何原因不能使用闭包,那么另一种方法是为变量创建一个“名称空间”
var MyCompany = { };
MyCompany.MyLibrary = { };
MyCompany.MyLibrary._a = new a();
通过这种方式,您可以将代码限制为获取单个全局名称(MyCompany),其他变量和方法驻留在该名称空间内。一般来说,Javascript开发人员会尽量避免这种情况,因为不同的库在全局范围内可能会相互冲突。为了避免这一点,考虑(如果可能的话)使用所谓的闭包来为变量创建一个私有范围。看起来是这样的:
(function() {
_a = new a();
})();
内部函数中声明的所有内容对于外部代码都是不可见的
如果出于任何原因不能使用闭包,那么另一种方法是为变量创建一个“名称空间”
var MyCompany = { };
MyCompany.MyLibrary = { };
MyCompany.MyLibrary._a = new a();
通过这种方式,您可以将代码限制为获取单个全局名称(MyCompany),而其他变量和方法则驻留在该名称空间中。您的
\u a.Foo()
并不能(准确地)实现您所认为的功能;-)要么做a.prototype.Foo=function(){}
要么在构造函数内部:this.Foo=function(){}
哦,这是个打字错误。谢谢你指出。你的\u a.Foo()
没有(完全)做你认为它做的;-)要么做a.prototype.Foo=function(){}
要么在构造函数内部:this.Foo=function(){}
哦,这是个打字错误。感谢您指出。经过一些研究,我发现了另一个类似这样的名称空间声明:var MyCompany=MyCompany | |{};有什么区别?我的公司到底是什么?函数?对象或者别的什么?@NSF如果我记得正确,这是一种检查对象是否为null(JavaScript通常将其视为大致等同于“false”)的方法,如果是,则创建一个新的JavaScript对象。@NSF Tieson T.完全正确,该语句基本上说“获取现有引用,或者在不存在的情况下创建它”。是的,它是一个对象。避免全局变量的主要原因是可能与其他来源的同名属性发生“冲突”。使用“namesapce”对象并不能降低这方面的风险,您与mylibrary.somemethod
的冲突可能性与mylibrary\u somemethod
一样大。不过,使用对象还有其他好处,但这些好处很小,主要与样式有关。最好的保护是使用任何库当前未使用且不太可能被选择的前缀。许多库都声称“$”(首先强调了为什么它是一个错误的选择)。@RobG的观点很好,但是如果您有多个变量声明_a、_b、_c等,那么使用单个名称空间至少不会减少“表面积”吗可以这么说吗?在一些研究之后,我发现了另一个类似这样的名称空间声明:var MyCompany=MyCompany | |{};有什么区别?我的公司到底是什么?函数?对象或者别的什么?@NSF如果我记得正确,这是一种检查对象是否为null(JavaScript通常将其视为大致等同于“false”)的方法,如果是,则创建一个新的JavaScript对象。@NSF Tieson T.完全正确,该语句基本上说“获取现有引用,或者在不存在的情况下创建它”。是的,它是一个对象。避免全局变量的主要原因是可能与其他来源的同名属性发生“冲突”。使用“namesapce”对象并不能降低这方面的风险,您与mylibrary.somemethod
的冲突可能性与mylibrary\u somemethod
一样大。不过,使用对象还有其他好处,但这些好处很小,主要与样式有关。最好的保护是使用任何库当前未使用且不太可能被选择的前缀。许多库都声明了“$”(首先强调了为什么它是一个不好的选择)。@RobG的观点很好,但是如果您有多个变量声明_a、_b、_c等等,那么使用单个名称空间至少会减少“表面积”吗?