65

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

例如,使用以下代码

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

可取吗?

4

3 回答 3

114

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

于 2012-09-12T17:20:36.607 回答
9

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

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

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

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

于 2018-08-12T10:44:01.937 回答
2

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

(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();
于 2017-07-16T05:38:03.653 回答