在 JavaScript 'window' 对象中存储变量是使用该对象的正确方法吗?

IT技术 javascript jquery dom window
2021-02-20 12:41:29

(也许)我刚刚通过在 JavaScript对象中“存储”/“保存”一个变量解决了我的问题(如何在从对话框窗口成功提交表单后更新前端内容?window但是,由于我是 JavaScript 方面的新手,所以我怀疑在 JavaScriptwindow对象中存储/保存变量是否是使用该对象的“常见”/“正确”方式是吗?

例如,使用以下代码

$('.trigger').click(function() {
  window.trigger_link = this;
});

是可取的?

3个回答

在 JavaScript 中,任何全局变量实际上都是window对象的一个属性使用一个等同于(并且可以互换)使用另一个。

使用全局变量当然是“常见的”,所以问题是它是否“合适”。通常,不鼓励使用全局变量,因为它们可以从任何函数访问,并且您可能会面临多个函数尝试读取和写入相同变量的风险。(这适用于任何环境中的任何编程语言,而不仅仅是 JavaScript。)


通过为您的应用程序创建一个唯一的命名空间来解决这个问题最简单的方法是创建一个具有唯一名称的全局对象,并将变量作为该对象的属性:

window.MyLib = {}; // global Object container; don't use var
MyLib.value = 1;
MyLib.increment = function() { MyLib.value++; }
MyLib.show = function() { alert(MyLib.value); }

MyLib.value=6;
MyLib.increment();
MyLib.show(); // alerts 7

另一种方法是使用.data()将变量附加到相关的 DOM 元素。这并非在所有情况下都实用,但这是获取可以全局访问的变量而不将它们留在全局命名空间中的好方法。

这里实际上没有提到的,可能是为什么不用 window 作全局范围载体的最大问题是它在某些情况下可以被冻结(不可写)(我是从基于生产的经验中讨论的)。

一个好的模式实际上只是创建一个全局变量,该变量将用于应用程序中的所有常见内容

var Application = {};
Application.state = { name: 'Application' }
.
.

我发现在 javascript 中对我来说最好的模式是使用Redux拥有一个全局状态

你能描述一下窗户什么时候可以被冻结吗?
2021-04-20 12:41:29
碰撞@dagoltz 问题
2021-04-22 12:41:29
我喜欢使用一个尽可能安全且唯一的名称,而不会太神秘。Application是一个相当通用的名称,可以被其他一些脚本使用,并将它分配给一个空对象将覆盖已经存在的名称。我来到这篇文章是因为 Adob​​e Analytics 使用了一个 window.s 对象,我认为这是一个非常通用的全局标识符。由于传统目的,它可能仍然如此。还有无数情况下代码与 jQuery 使用的 $ 冲突。
2021-04-27 12:41:29
直到现在我还没有看到有关问题的评论,所以我不记得是什么原因,我知道我在私人模式下使用 Safari 时遇到了问题。King Holly 我同意,回顾过去,应用程序是一个过于笼统的术语,使用您的产品/应用程序名称会好得多。
2021-04-28 12:41:29

在您的应用程序中创建唯一命名空间的另一种模式。

function myApp()
{
    var value = 5;
    function addToValue(x)
    {
         value += x;
    }
}()

如果您希望之后可以访问函数/值,您可以将它们存储在这样的对象中:

function myApp()
{
    this.value = 5;
    this.addToValue = function(x)
    {
         this.value += x;
    }
}
var myInstance = new myApp();