Javascript如何为';范围';名称空间对象的定义

Javascript如何为';范围';名称空间对象的定义,javascript,Javascript,我有一个名称空间的对象 ONE.TWO.THREE = { my_var:'', myfunction : function () { my_var = 1; //does not work >> undefined ONE.TWO.THREE.my_var = 1 ; // works fine but it is a lot of code } ...... } “This”不起作用

我有一个名称空间的对象

    ONE.TWO.THREE = {
    my_var:'', 
    myfunction : function () {
      my_var = 1;                //does not work >> undefined
      ONE.TWO.THREE.my_var = 1 ; // works fine but it is a lot of code
    }  
  ...... }
“This”不起作用(窗口…),因此我必须创建或使用“scope”或“self”变量。但在这种情况下,我不能(或者我不知道如何)

现在,我必须使用1.2.3.my_var….
是否可以创建某种别名


有什么把戏吗?我必须换成模块模式吗?谢谢。

您有以下选择:

ONE.TWO.THREE = {
   my_var : 0,
   fn : function(){ this.my_var = 10; }
};
ONE.TWO.THREE.fn(); // Will se ONE.TWO.THREE.my_var to 10 
                    // because the this will referr to the object
或将临时变量参照到对象

var XX = {
  YY : {
     my : 0,
     fn : function(){
         var tmp = XX.YY; // Save the var to a temp var.
         tmp.my = 10;
     }
  }
}

XX.YY.fn() // Set to 10
XX.YY.my // Will be 10
我必须换成模块模式吗

您不必这样做,但如果您不想使用
(问题下方的注释建议您不要),这可能是最清楚、最简单的方法:

ONE.TWO.THREE = function() {
    var three = {
        my_var: '',
        myfunction: function() {
            three.my_var = 1;
        }
    };
    return three;
}();

并使用
this.myVar=1?@Niels'This'不起作用(=窗口)。我正在从setTimeot funcs和eventlistener addings调用1.2.3.myfunction。也许这就是问题所在?现在我想我将使用一个临时别名……当您将函数发送到
setTimeout
时,您可以使用
bind
setTimeout(ONE.TWO.THREE.myfunction.bind(ONE.TWO.THREE),1000);
)或将您的函数包装在匿名函数中(
setTimeout(function(){ONE.TWO.THREE.myfunction();},1000);
)。这两种解决方案都将确保保留正确的上下文,以便您可以安全地使用
this.my_var=1。谢谢大家。解决方案也不清楚,是否有用。。。。现在我将保留完整的名称空间样式……@civiltomain:使用
this
是否有问题?
tmp
变量的意义是什么
XX.YY.my=10
也会做同样的事情。在本例中,还没有。但是如果你想重复使用这个变量10次,你只需要定义这个临时值一次。而不是一直写完整的结构。是的。。。有时很难找到要使用的模式/样式。。。。对象文字、原型、模块。。。。谢谢way@civiltomain心理学研究表明,你考虑的选择越多,你选择的可能性就越小。奇怪,但却是真的。。。