如何在 jQuery 中存储全局值(不一定是全局变量)?

IT技术 javascript jquery global-variables
2021-02-04 21:27:39

目前,我正在处理一个使用大量 JavaScript、jQuery、Microsoft 客户端 JavaScript 和其他库的遗留网页。底线 - 我不能从头开始重写整个页面,因为业务无法证明它的合理性。所以……就是这样。无论如何,我需要用一个变量污染(我真的没有尝试过)全局命名空间。我正在考虑三个选项 -

  1. 只需使用普通的 JavaScript 声明存储/检索它 - var x = 0;

  2. 使用 jQuery 在 DOM 标签中存储/检索值 - $("body").data("x", 0);

  3. 使用隐藏的表单字段,并使用 jQuery 设置/检索值 - $("whatever").data("x", 0);

有没有更好的办法?我查看了现有的一堆代码,我不相信该变量可以在函数中限定范围。

6个回答

您可以在 jQuery 对象内创建一个命名空间,如下所示:

$.mynamespace = { 
    myVar : "something", 
    myVar2 : "somethingElse" 
}; 

或者:

$.mynamespace = {};
$.mynamespace.myVar = "something";
$.mynamespace.myVar2 = "somethingElse";

请记住,任何名为“mynamespace”的插件方法都将被覆盖,因此请务必使用合理的名称。

@Pedro - 不必如此。我只是指出这是一种可能性。
2021-03-19 21:27:39
如果我想使用它,我应该在哪里声明它?我所有的 javascript 代码都在一个 JS 文件中。我不想将 JavaScript 代码与 HTML 代码混合在一起。
2021-03-19 21:27:39
我可以在所有 iframe 表单父级中使用这个全局变量吗?
2021-03-19 21:27:39
这是一个愚蠢的解决方案,它很容易在声明的命名空间与 jQuery 对象的变量和方法之间发生名称冲突。我不明白这个解决方案的value。对我来说,这不好。
2021-03-21 21:27:39
为什么命名空间变量要声明为 jQuery 的一个属性?!
2021-03-24 21:27:39

对我来说,处理这种情况的最好方法是在 window 对象中定义一个对象:

window.my_config =
{
    my_var1 : 1,
    my_var1 : 2,
    my_var1 : 3
};

这将使您的范围保持整洁。每当您使用window.my_config查看代码的任何人访问全局时,都会知道正在访问全局。

这对我来说比使用 jquery 命名空间更有意义。有什么理由不能用这种方式一样好或更好吗?
2021-03-28 21:27:39

您可以在全局范围内创建一个哈希并将其用作命名空间:

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'
这是一个愚蠢的解决方案,它很容易在声明的命名空间和其他全局变量和方法之间发生名称冲突。我不明白这个解决方案的value。对我来说,这很糟糕。
2021-03-18 21:27:39
您确实可以控制全局范围中存在哪些名称,而您无法控制可能在更新时添加到 jQuery 的方法和变量名称。这是命名空间在许多语言中明确存在的重要原因之一。当他们不这样做时,名称开始变得奇怪(即:Smalltalk-systems 类名)
2021-03-18 21:27:39
不总是。没有什么可以阻止某些流氓库覆盖您的哈希。本质上,如果没有显式命名空间,就无法避免这个问题这就是为什么 jQuery module创作文档为了命名空间的目的而建议在 jQuery 对象中使用单个散列的原因,因为 jQuery 命名空间实际上仅限于流行的插件。
2021-03-18 21:27:39

只是与您分享我的做法,我会在所需的 JavaScript 文件中创建一个全局对象/变量,并带有一个合理的前缀,就像我在一个页面上工作一样,这个对象将是一个文本框,然后我会命名它:

g_TxtMyValue = 'value';    // g_ specifies it to be a global variable, it is one
                           // of the many conventions used

如果你有多个全局变量,你也可以有一个命名空间,比如:

my_txt = {};  // For a real site I would use a prefix relative to the project
              // name instead of "my".

my_txt.testValueOne = 'Value one';
my_txt.testValueOne = 'Value two';

这些变量在初始化后将在整个网站上提供给您。

我希望这有帮助。

使用下划线isEmpty()

_.isEmpty('')会回来true