2014-05-07 136 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'使用,並且沒有「父範圍」的概念。您需要明確引用該對象。 –

相關問題