在Javascript中声明一个全局变量比较好吗?
什么时候用JavaScript声明一个全局变量是好的?关于全局变量的典型建议包括: 我有时会遇到这样的情况:在用户活动的持续时间内,变量的值是否可用至关重要。例如,了解打开的页面的状态。另一种情况是,有一个较长的流程,其中包含许多较小的功能,但在整个流程中需要维护一些值。与其将参数从一个函数传递到另一个函数,并希望它不会变得混乱,不如创建一个全局变量在Javascript中声明一个全局变量比较好吗?,javascript,global-variables,Javascript,Global Variables,什么时候用JavaScript声明一个全局变量是好的?关于全局变量的典型建议包括: 我有时会遇到这样的情况:在用户活动的持续时间内,变量的值是否可用至关重要。例如,了解打开的页面的状态。另一种情况是,有一个较长的流程,其中包含许多较小的功能,但在整个流程中需要维护一些值。与其将参数从一个函数传递到另一个函数,并希望它不会变得混乱,不如创建一个全局变量 一般来说,声明全局变量是不好的做法 可能导致“名称空间污染”问题 函数内外具有相同名称的重复变量声明 全局变量的查找速度比局部变量慢 很容易忘记
- 一般来说,声明全局变量是不好的做法
- 可能导致“名称空间污染”问题
- 函数内外具有相同名称的重复变量声明
- 全局变量的查找速度比局部变量慢
- 很容易忘记您声明了全局变量,因为它与您正在处理的当前代码无关
- 跟踪和调试全局变量很困难
- 异步使用全局变量可能会导致并发问题
- 一个常量,其中有很多字符,经常使用。减少整个代码的大小
- 保存必须被监视的当前状态,并可随时用于多个功能
- 高使用率和/或
- 至少两个相互不在范围内的不同功能需要
/* The state of what page is currently display, must be available to
the entire application at all times.
Variable is declared outside of a function enclosure.
*/
var whichPageDisplayed = '';
function changePage(pageNameToOpen) {
if (whichPageDisplayed === 'home') {
close the home page;
open the new page;
//Make sure to record what the new current open page is
whichPageDisplayed = pageNameToOpen;
};
我正在寻找关于何时使用全局变量是好的原因
如果全局变量总是被认为是坏的,那么在没有全局变量的情况下,我如何处理上述两种情况
“异步使用全局变量可能导致并发性问题”的原因不应仅限于全局变量。异步使用任何东西都可能导致并发问题,所以我不认为这是一个反对全局变量的论点
“很容易忘记您声明了全局变量,因为它与您正在处理的当前代码不在同一位置”的原因似乎是一个编码规则问题。如果我看到在那部分代码中没有var=thisVar
语句,我会想,“也许我把它声明为一个全局变量?”。然后我会搜索它
“跟踪和调试全局变量很难”我的代码编辑器中有一个“搜索所有文件”选项。它搜索所有文件,并显示搜索找到匹配项的每一行代码。没那么难。根据我使用的浏览器和开发人员工具,错误消息可能会向我显示错误产生的确切代码行。减少总体代码大小不是一个有效的原因。迷你们会把它撞倒的。此外,如果您有类似于您的
dc.getElementById('main menu').style.display
的示例,您需要一个方法来帮助您。例如getDisplayStyle('MainMenu')
。这样做只是一种良好的实践,因为它可以让您将逻辑保持在一个位置
保存状态也不是一个有效的理由。将代码保存在模块中。例如,您的代码变得“更好”:
<>你应该考虑一个全局变量,如果一个库需要它,或者如果你需要在“某物”存在之前设置配置选项(并且你不使用AMD类型的模块)。例如,一个流行的WYSIWYG编辑器专门寻找一个全局变量,该变量为设置定义了一些常量
基本上,对于几乎所有可能使用的全局变量,都存在将其包装在某种模块中的反论点。这似乎不是特别针对JS的;我不知道这对程序员来说是否会更好。就像你说的,高使用率或者你需要的东西随时可用。和助手函数,如
var$=function(id){returndocument.getElementById(id);}代码>。声明一个显示模块,并向其他模块公开您需要的任何内容。或者使用jQuerydata()
方法将其存储在$.cache
中。它将是全局的,但不会污染全局名称空间。您可以将其重新打开,方法是将其措辞为“如何使它们不需要全局?”这样,代码使用this
将数据存储在名为\u currentPage
的变量中?并保留此中的值。\u currentPage
。它之所以被维护是因为所有东西都被包装在一个数组中PageState
?对象PageState
,是的。明白了。对象是全局存储的吗?是否在函数外部创建对象?还是将对象放在另一个函数中?在本例中,它是PageState
对象。在这种情况下,不需要将其放在全局范围之外的任何地方(除了将其包装到应用程序的闭包或命名空间中之外,实际上没有其他地方可以放置它)。如果您使用的是AMD风格的模块,您可以将“PageState”定义为该对象,然后将其注入到需要的地方。或者如果你使用的是Angular之类的东西,它也有注入功能。我试着比较将变量放入全局范围与将对象放入全局范围,而全局范围又包含了我本应该放入全局范围的变量。不管怎样,我都在全球范围内做一些事情。除非JavaScript以某种方式管理全局范围内的“PageState”对象
/* The state of what page is currently display, must be available to
the entire application at all times.
Variable is declared outside of a function enclosure.
*/
var whichPageDisplayed = '';
function changePage(pageNameToOpen) {
if (whichPageDisplayed === 'home') {
close the home page;
open the new page;
//Make sure to record what the new current open page is
whichPageDisplayed = pageNameToOpen;
};
PageState = {
changePage: function (pageNameToOpen) {
if(this._currentPage == 'home') {
/*******/
}
this._currentPage = pageNameToOpen;
},
getCurrentPage: function () {
return this._currentPage;
}
};
PageState.changePage(pageNameToOpen);