Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用全局引用是一种好的做法吗?_Javascript - Fatal编程技术网

在JavaScript中使用全局引用是一种好的做法吗?

在JavaScript中使用全局引用是一种好的做法吗?,javascript,Javascript,例如,javascript代码是: function a() { this.Foo = function() {//...} } 我通常会创建一个全局引用: _a = new a(); 然后在正文或其他脚本区域的任何位置使用它: _a.Foo() 这是好的还是坏的做法?或者有更好/更专业的方法来做到这一点吗?一般来说,Javascript开发人员会尽量避免这种情况,因为不同的库可能在全局范围内相互冲突。为了避免这一点,考虑(如果可能的话)使用所谓的闭包来为变量创建一个私有范

例如,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等等,那么使用单个名称空间至少会减少“表面积”吗?