2014-05-07 138 views
2

如何从内部函数c1访问container.a?如何从内部函数访问外部范围?

var container = { 
    a : 'blah', 
    b : function(){ 
     console.log(this.a); // prints 'blah' 
    }, 
    c : {   
     // how to access container.a from here? 
     c1: function(){ 
      // and here? 
     } 
    } 
} 
+0

不能'c'使用'this'? –

+0

'this'将返回'Window'对象的内部c – fromvega

+0

如何重组它,以便您可以将'container'对象传递到'c'中。 – Chris

回答

3

可以指的是保持对对象的引用外部变量,但这是不一定稳定。如果“容器”的值改变了,它将不起作用。为了防止这种情况,你可以在一个匿名函数封装对象的定义:

var container = function() { 
    var obj = { 
    a : 'blah', 
    b : function(){ 
     console.log(this.a); // prints 'blah' 
    }, 
    c : {   
     c1: function(){ 
     console.log(obj.a) 
     } 
    } 
    }; 

    return obj; 
}(); 

看起来非常相似,但这样做你保证的价值“目标文件”不会改变(除非对象中的一些其他函数改变它,这将是一个奇怪的事情)。现在,不管最初分配给“容器”的对象发生什么情况,那个.c.c1()函数都将继续工作。

+0

这就是我正在寻找的。谢谢! – fromvega

4

只是指容器它是一个封闭

var container = { 
    a : 'blah', 
    b : function(){ 
     console.log(this.a); // prints 'blah' 
    }, 
    c : {   
     c1: function(){ 
      console.log(container.a) 
     } 
    } 
} 
+0

这是有效的,但我应该精简我正在寻找一种方法来避免使用容器变量的名称!可能吗? – fromvega

3

按名称:

var container = { 
    a : 'blah', 
    b : function(){ 
    console.log(this.a); // prints 'blah' 
    }, 
    c : {   
    // how to access container.a from here? 
    c1: function(){ 
     console.log(container.a); 
     // and here? 
    } 
    } 
} 
+0

有没有办法避免使用容器变量的名称? – fromvega

+1

在这种情况下,没有。它不能作为'this'使用,并且没有“父范围”的概念。您需要明确引用该对象。 –

相关问题