【问题标题】:JavaScript Closures use global setting object or pass it to each functionJavaScript 闭包使用全局设置对象或将其传递给每个函数
【发布时间】:2011-09-27 09:34:59
【问题描述】:

关于 javascricpt 闭包的另一个问题。我有一个全局“设置对象”。是在全局范围内的函数中使用它还是在每次函数需要访问对象时传递对象更好?

为了更好地了解情况here

请忽略“baz()”也会从闭包的全局范围内获取“foobar()”中传递的对象。您会看到两个版本都可以正常工作。

问题是我将函数需要工作的任何对象传递给每个函数并且每次(不必要的开销?),这可能很好并且易于阅读/理解,但我正在认真考虑改变这一点。缺点是我必须保持“this”范围,无论它变得更深,对吗?

感谢您的建议!

【问题讨论】:

    标签: javascript closures global-variables parameter-passing


    【解决方案1】:

    您的设置对象不是全局,它是在闭包中定义的。

    由于意图是它可以被闭包中的其他函数访问,我想说直接访问该对象而不将其作为参数传递是 100% 没问题的。 p>

    FWIW,即使您确实将其作为参数传递,开销也可以忽略不计,因为仅传递对象的 引用,而不是整个对象的副本。

    【讨论】:

      【解决方案2】:

      所以你基本上有三个选择:

      • 您希望将设置公开为全局变量,并让您的函数访问它,
      • 您希望将设置隐藏为实现细节并让您的函数访问它,
      • 您希望为不同的函数提供不同的设置对象。

      全局变量法

      嗯,我想这有点像任何全局变量。如果设置是一个单例(例如它描述了您的应用程序)并且您看不到使用不同设置对象调用相同函数的任何好处,那么我不明白为什么它不能是全局变量.

      也就是说,由于所有命名冲突,在 Javascript 中最好将所有全局变量“命名空间”。因此,您应该拥有一个全局变量MyGlobalNamespace,而不是全局变量foobar,它是一个具有属性的对象:MyGlobalNamespace.fooMyGlobalNamespace.bar

      私有变量方法

      让闭包访问私有变量是隐藏实现细节的好模式。如果您不想将设置对象作为 API 公开,那么这可能是正确的选择。

      附加函数参数方法

      基本上,如果您发现为不同的函数调用提供不同的设置可能会有所收获。或者,如果你能想象未来会有这样的收获。如果您的应用程序中有许多设置实例,则显而易见的选择。

      编辑

      关于cmets的问题:

      示例 1)

      var blah = 123;
      
      function fizbuzz() {
          console.log(blah); // <-- This is an example of a closure accessing 
                             // a variable
          console.log(this.blah); // <-- Most likely makes no sense. It might work, 
                                  // because by default this will be set to a global 
                                  // object named window, but this is probably not 
                                  // what you want. In other situations this might 
                                  // point to another object.
      }
      

      示例 2)

      var obj = {
      
          blah: 123,
      
          fizbuzz: function() {
              console.log(this.blah); // <-- This is *NOT* an example of a closure
                                      // accessing a private variable. It's rather the
                                      // closest Javascript can get to accessing an
                                      // instance variable by a method, though this 
                                      // terminology shouldn't be used.
              console.log(blah); // <-- This MAKES NO SENSE, there is no variable blah 
                                 // accessible from here.
          }
      };
      

      简而言之,我鼓励您阅读一些关于 Javascript 基本概念的好书。它有其独特之处,很高兴了解它们。

      【讨论】:

      • 谈论命名空间 js 变量:我确实命名了闭包本身。你写了命名空间“foo”和“bar”。我想你的意思只是“Foo”,对吧?因为“bar”、“baz”和“foobar”只是“私有”函数,而闭包中的任何内容都不需要命名空间?另外,我可以确保始终使用“this”来调用闭包内的变量,对吗?那是另一回事,我可以使用“this.settings”或“setting”,两者都可以,但第一个确保我访问闭包内的变量(可能是潜伏在某处的另一个全局“设置”变量)?
      • 这只是一个例子,我的foobar 不应该与你的foobar 有任何关系。
      • @junior 我绝对同意这个答案:stackoverflow.com/questions/74884/good-javascript-books/…。书很好,网上也有他的讲座。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2014-09-22
      相关资源
      最近更新 更多