【问题标题】:how to pass variable to Javascript Namespace如何将变量传递给 Javascript 命名空间
【发布时间】:2012-01-21 04:52:54
【问题描述】:

我已经创建了一个这样的 Javascript 命名空间:

var MyApp = function() {
      return {
        someFunction : function(x) {}
             alert(MyApp.y);
      }
}();

这让我可以这样做:

MyApp.someFunction(x);

我希望能够做到以下几点:

MyApp.y = "test" 这样我的 someFunction 就可以访问这个变量 Y。

关于如何解决这个问题的任何想法?我想保持我的 NS 语法完好无损,所以一个适用于我的示例代码的解决方案会很好。

【问题讨论】:

  • 您将 someFunction 放入外壳中是否有任何特殊原因?据我所知,一旦你完成了它,你就不能将新变量传递给那个外壳,但是你当然可以访问全局变量。如果您不需要 需要 外壳,但是您可以使用 this.someFunction = function(x) ... 而不是 return 块。同样猜测,当您将其存储在 MyApp 中时,您可能想要 new 该函数。

标签: javascript namespaces javascript-namespaces


【解决方案1】:

您所描述的应该有效。 (除非您有语法错误和未使用的参数x。)

var MyApp = function() {
  return {
    someFunction : function(x) {
         alert(MyApp.y);
    }
  }
}();
MyApp.y = 'test';
MyApp.someFunction() // alerts 'test'

另一种方法是将外部函数更像构造函数,并将 y 作为闭包传递:

var MyApp = (function (y) {
    return {
        y: y,
        someFunction: function () {
            alert(MyApp.y); // or alert(this.y)
        }
    }
} ('test'));
MyApp.someFunction(); // alerts 'test'

【讨论】:

  • 你是对的,确实如此。好像我错过了我的代码中的一些小问题。谢谢!
【解决方案2】:

我会选择这样的:

var MyApp = function() {
    var _y = "default value";
    return {
        someFunction: function(x) {
            console.log(_y);
        },
        setY: function (y) {
            _y = y;
        }
    }
}();

这意味着在为y 赋值之前调用MyApp.someFunction() 是安全的。这也意味着变量的内容是在命名空间的范围内维护的,例如

console.log(MyApp._y); // undefined

以下是如何使用它:

MyApp.someFunction(); // "default value"
MyApp.setY("new value");
MyApp.someFunction(); // "new value"

【讨论】:

  • @akellehe 为什么? JavaScript 不是 Python。使用下划线(本身)不会阻止变量出现在for…in 循环中,或者在他运行MyApp.hasOwnProperty('_y') 时为真。 JavaScript 中的私有成员只是构造函数的变量。它们只能通过私有和特权方法访问。 Ref我不反对这种方法,我只是看不到下划线的意义,OP 并没有要求将值设为私有。
  • 下划线使私有变量更具可读性。当你在某个地方看到它时,它的范围就会立即被理解。与类/实例方法中的局部变量区分开来非常容易。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2019-07-07
  • 2020-01-11
  • 2017-04-29
相关资源
最近更新 更多