如何将变量传递到Javascript命名空间

如何将变量传递到Javascript命名空间,javascript,namespaces,javascript-namespaces,Javascript,Namespaces,Javascript Namespaces,我创建了一个Javascript名称空间,如下所示: var MyApp = function() { return { someFunction : function(x) {} alert(MyApp.y); } }(); 这使我能够做到: MyApp.someFunction(x); 我希望能够做到以下几点: MyApp.y=测试以便我的someFunction可以访问此变量y 有没有办法解决这个问题?我想保持我的NS语

我创建了一个Javascript名称空间,如下所示:

var MyApp = function() {
      return {
        someFunction : function(x) {}
             alert(MyApp.y);
      }
}();
这使我能够做到:

MyApp.someFunction(x);
我希望能够做到以下几点:

MyApp.y=测试以便我的someFunction可以访问此变量y


有没有办法解决这个问题?我想保持我的NS语法不变,这样一个与我的示例代码一起工作的解决方案就更好了。

您所描述的应该可以工作。除了语法错误和未使用的参数x

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

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

你所描述的应该有用。除了语法错误和未使用的参数x

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

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

我会这样说:

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"

我会这样说:

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"

有没有什么特别的原因让你把一些函数放在一个外壳里?据我所知,一旦你完成了它,你就不能将新的变量传递给那个外壳,但是你当然可以访问全局变量。但是,如果您不需要机柜,您可以这样做。someFunction=functionx。。。而不是返回块。还有一个猜测是,当你将某个函数存储在MyApp中时,你可能想重新创建该函数。有什么特别的原因让你将某个函数放在一个附件中吗?据我所知,一旦你完成了它,你就不能将新的变量传递给那个外壳,但是你当然可以访问全局变量。但是,如果您不需要机柜,您可以这样做。someFunction=functionx。。。而不是返回块。还有一个猜测是,当你把它存储在MyApp中的时候,你可能想要新的功能。好像我在代码中遗漏了一些小的东西。谢谢你说得对,的确如此。好像我在代码中遗漏了一些小的东西。谢谢@为什么?JavaScript不是Python。使用下划线本身不会阻止变量出现在for…in循环中,或者在运行MyApp.hasOwnProperty时变为true。JavaScript中的私有成员只是构造函数的变量。它们只能通过私有和特权方法访问。我并不反对这种方法,我只是不明白下划线的意义,OP也不要求值是私有的。下划线使私有变量更具可读性。当你在某个地方看到它时,它的范围就会立即被理解。在类/实例方法中很容易区分局部变量。@akellehe为什么?JavaScript不是Python。使用下划线本身不会阻止变量出现在for…in循环中,或者在运行MyApp.hasOwnProperty时变为true。JavaScript中的私有成员只是构造函数的变量。它们只能通过私有和特权方法访问。我并不反对这种方法,我只是不明白下划线的意义,OP也不要求值是私有的。下划线使私有变量更具可读性。当你在某个地方看到它时,它的范围就会立即被理解。在类/实例方法中很容易区分局部变量。