Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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_Global Variables - Fatal编程技术网

在Javascript中声明一个全局变量比较好吗?

在Javascript中声明一个全局变量比较好吗?,javascript,global-variables,Javascript,Global Variables,什么时候用JavaScript声明一个全局变量是好的?关于全局变量的典型建议包括: 我有时会遇到这样的情况:在用户活动的持续时间内,变量的值是否可用至关重要。例如,了解打开的页面的状态。另一种情况是,有一个较长的流程,其中包含许多较小的功能,但在整个流程中需要维护一些值。与其将参数从一个函数传递到另一个函数,并希望它不会变得混乱,不如创建一个全局变量 一般来说,声明全局变量是不好的做法 可能导致“名称空间污染”问题 函数内外具有相同名称的重复变量声明 全局变量的查找速度比局部变量慢 很容易忘记

什么时候用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);}。声明一个显示模块,并向其他模块公开您需要的任何内容。或者使用jQuery
data()
方法将其存储在
$.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);