【问题标题】:Eliminating local variables in a namespace消除命名空间中的局部变量
【发布时间】:2012-08-17 18:00:51
【问题描述】:

我想去掉某个命名空间中的局部变量。

这是我的库的最顶层,我在其中设置了一些本地对象来保存其他对象 - 模型、视图、控制器。

但是有人告诉我有一种方法可以在没有局部变量的情况下将库组织到命名空间。

post here 中,用户 Raynos 说这可能是组织图书馆的最佳方式。命名空间的局部变量为零。

我怎样才能把本地人一起排除在我的图书馆里?

(function (window, document) {
    "use strict";
    var Mo = {},
        Vi = {},
        Co = {},
        Su = {};

【问题讨论】:

  • 从技术上讲,这些变量不是全局变量,它们是您的自动执行匿名函数的本地变量。你的意思是说这对你的口味来说仍然“过于全球化”吗?
  • Raynos 的回答是关于模块化组织,他确实说您应该拥有“零全局变量”。但是请注意,他的ncore GitHub README 中的两个代码示例都像您一样创建局部变量。你可能把“全球”的概念走得太远了:)
  • 这是可能的,因为正如我之前所说,这些变量不是全局的,它们是本地的。如果您绝对想将它们视为全局的,那么您仍然必须在某处存储状态。您可以将所有这些变量组合到一个对象中,但根据您的定义,该对象仍然是“全局的”。
  • @HiroProtagonist 在使用自调用模式时,您总共引入了零个全局变量。我有一种感觉,您在问如何处理公共或私有属性和方法......
  • @Mathew, Frederic - 很抱歉给您带来了困惑。我已经更新了问题,请阅读(如果你有时间)我在问题中发布的链接作为背景。

标签: javascript


【解决方案1】:

我能满足您的要求的最接近的方法是“隐藏”参数中的变量:

(function(window, document, Mo, Vi, Co, Su) {
    "use strict";
    // The rest of your code here, using the arguments instead of variables...
})(window, document, {}, {}, {}, {});

但是有两件事:

  • 这些参数与您尝试删除的变量具有完全相同的范围(即它们是匿名函数的本地变量)。

  • 这将MoViCoSu 的声明(在函数的参数列表中,在文件顶部)和它们的初始化(在传递给函数,在文件的底部)。这会降低代码的可读性和可维护性,这可能不是您的目标。

【讨论】:

  • 实际上....您只是缩小了范围链...我认为 {}、{}、{} 和 {} 实际上会驻留在“窗口”的范围内。这可能是答案...Mo、Vi、Co 和 Su 只是引用这些未命名的对象以减少范围链...但不是 100%
  • 它们确实驻留在调用者的范围内(可能不是全局范围),但这并不重要,因为除了函数的参数之外没有对它们的引用。调用者中没有其他代码可以访问它们。
  • 本例中调用者的作用域是窗口或全局作用域……你写的函数表达式在这个例子中是全局作用域。但是 - 你能详细说明“调用者中没有其他代码可以使用它们”吗?
  • 要使用它们,调用者必须按名称引用它们。但从调用者的角度来看,它们只是对象文字——它们没有名称。它们仅在匿名函数接收到它们时才获得名称,并且这些名称仅在函数的范围内有效(模闭包)。
  • 所以你同意在这个例子中......{},{},{},{} 在没有名字的窗口范围内“活着”......
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 2012-03-13
  • 1970-01-01
  • 2011-03-25
  • 2011-08-31
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多