【问题标题】:Storing a variable in the JavaScript 'window' object is a proper way to use that object?在 JavaScript“窗口”对象中存储变量是使用该对象的正确方法吗?
【发布时间】:2012-09-05 18:37:33
【问题描述】:

(也许)我刚刚通过在 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;
});

是否可取?

【问题讨论】:

    标签: javascript jquery dom window


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 你能描述一下什么时候可以冻结窗口吗?
      • 碰到@dagoltz 问题
      • 我喜欢使用一个尽可能安全且唯一而又不至于太神秘的名称。 Application 是一个相当通用的名称,可以由其他脚本使用,并将其分配给空对象将覆盖已经存在的名称。我来这篇文章是因为 Adob​​e Analytics 使用了一个 window.s 对象,我认为它是一个非常通用的全局标识符。由于遗留目的,它可能一直如此。还有无数情况下代码与 jQuery 使用的 $ 冲突。
      • 直到现在我还没有看到有问题的 cmets,所以我不记得是什么原因,我知道我在私人模式下遇到了 Safari 的问题。 King Holly 我同意,回顾过去,应用程序过于笼统,使用您的产品/应用程序名称会更好。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2012-05-26
        • 2012-06-10
        • 2013-10-15
        • 2013-04-13
        相关资源
        最近更新 更多