将变量存储在JavaScript';窗口';对象是使用该对象的正确方式吗?

将变量存储在JavaScript';窗口';对象是使用该对象的正确方式吗?,javascript,jquery,dom,window,Javascript,Jquery,Dom,Window,(可能)我刚刚通过在JavaScript窗口中“存储”/“保存”一个变量解决了我的问题()。然而,由于我是JavaScript方面的新手,我怀疑在JavaScript窗口中存储/保存变量是否是使用该对象的“常用”/“正确”方式。是吗 例如,使用以下代码 $('.trigger').click(function() { window.trigger_link = this; }); 是否可取?在JavaScript中,任何全局变量实际上都是窗口对象的属性。使用其中一个等同于使用另一个(并且可

(可能)我刚刚通过在JavaScript
窗口中“存储”/“保存”一个变量解决了我的问题()。然而,由于我是JavaScript方面的新手,我怀疑在JavaScript
窗口中存储/保存变量是否是使用该对象的“常用”/“正确”方式。是吗

例如,使用以下代码

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

是否可取?

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

使用全局变量肯定是“常见的”,所以问题在于它是否“合适”,因为它们可以从任何函数访问,并且您可能会有多个函数试图读取和写入相同的变量。(对于任何环境中的任何编程语言都是如此,而不仅仅是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


另一种方法是将变量附加到相关的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();

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

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

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

我发现javascript中最好的模式是使用全局状态。

你能描述一下窗口何时可以被冻结吗?bumping@dagoltz question我喜欢使用一个尽可能安全唯一而又不太神秘的名称<代码>应用程序
是一个相当通用的名称,可以由其他脚本使用,将其分配给空对象将覆盖已有的名称。我之所以要写这篇文章,是因为Adobe Analytics使用了window.s对象,我认为它是一个非常通用的全局标识符。由于遗留目的,它很可能一直如此。代码与jQuery使用的$冲突的情况也有很多。我直到现在还没有看到带有问题的注释,所以我不记得是什么原因,我知道我在私有模式下使用Safari时遇到了问题。King Holly我同意,“追溯性应用”一词太笼统,最好使用您的产品/应用名称。