在JavaScript“窗口”对象中存储变量是使用该对象的正确方法吗?

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

例如,使用以下代码

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

是明智的吗?

在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元素。 这在所有情况下都不实用,但它是获取可以全局访问的变量而不将它们留在全局命名空间中的好方法。

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

 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(); 

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

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

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

我在javascript中发现的最佳模式是使用Redux建立全局状态。