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

时间:2012-09-12 17:17:15

标签: javascript jquery dom window

(也许)我刚刚通过在JavaScript window对象中“存储”/“保存”变量解决了我的问题(How to update front-end content after that a form is successfully submitted from a dialog window?)。但是,由于我是JavaScript的新手,我有一些疑问,如果在JavaScript window对象中存储/保存变量是使用该对象的“常见”/“正确”方式 。是吗?

例如,使用以下代码

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

是可取的吗?

3 个答案:

答案 0 :(得分:67)

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

使用全局变量肯定是“常见的”,所以问题在于它是否“正确”。 Generally, global variables are discouraged,因为可以从任何函数访问它们,并且您可能有多个函数试图读取和写入相同的变量。 (任何环境中的任何编程语言都是如此,而不仅仅是JavaScript。)


通过创建a namespace unique to your application解决此问题。最简单的方法是创建一个具有唯一名称的全局对象,并将您的变量作为该对象的属性:

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

答案 1 :(得分:4)

这里实际上没有提到什么,并且可能是为什么不使用的最大交易突破 window 作为全球范围运营商的原因是它在某些情况下可能会被冻结(不可写)(我是从基于生产的经验出发)。

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

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

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

答案 2 :(得分:1)

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

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