2012-12-03 275 views
0
var abc = { 
    'a': 10, 
    'b': 10, 
    c: function() { 
     //like if I have many many functions in c 
     init_a(); 
     multiple(); 

     function init_a() { 
      abc.a = 30; 
     } 

     function multiple() { 
      alert(abc.a * abc.b); 
     } 

     function minus() { 
      alert(abc.a - abc.b); 
     } 
     return { 
      function myalert() { 
       var result = abc.a + abc.b; 
       alert(result); 
      } 
     } 
    }, 
    d: function() { 
     abc.c.myalert(); // ??? error?? 
     abc.c().myalert(); // ??? error?? **it run all functions in c but not just myalert, strange things happening... 
    } 

} 
abc.d(); 

什麼是在函數d中調用'myalert()'函數的正確語法?如何調用函數內部函數?

+0

沒有一個,fu此外,你在某處丟失了一個右括號'}'。 – Jamiec

+0

如果你不斷改變你的問題中的代碼,它會讓你很難給出一個有用的答案。我會更新我的答案,希望您完成更新代碼。 – AmericanUmlaut

+0

沒關係。當前版本包含語法錯誤 - 您將myalert函數定義爲返回對象的屬性,而不定義索引。 :( – AmericanUmlaut

回答

6

myalert()功能 是本地的abc.c(),所以這是不可能的。

您可以讓c()回報myalert()雖然:

c: function() { 
    return function myalert() { 
     // whatever 
    } 
}, d: function() { 
    this.c()() 
} 

注意,返回的函數沒有被命名,即return function() { .. }

更新

如果你想這樣稱呼它this.c().myalert(),然後c()需要返回,而不是直接作用的對象:

c: function() { 
    return { 
     myalert: function() { ... } 
    } 
} 

更新2

c()函數現在包含除myalert()聲明之外的其他語句。被調用時,init_a()multiple()在返回之前被調用。

我建議重構你的代碼,如移動myalert()到主對象,而不是:

var abc = { 
    'c': function() { 
     return { 
      myalert: function() { 
       alert('foo'); 
      } 
     }; 
    }, 
    'd': function(){ 
     abc.c().myalert(); // foo 
    } 
}; 
abc.d();​ 

演示:http://jsfiddle.net/g2KEK/

var abc = { 
    a: 10, 
    b: 10, 
    c: function() { ... } 
    myalert: function() { ... } 
    d: function() { 
     this.myalert(); 
    } 
} 
+0

this.c()()???我不能給它起一個名字嗎?我想區分這個函數是否能夠this.c()。myalert()? – FatDogMark

+0

奇怪,我用this.c ().myalert()但在我的代碼中,它實際上運行c中的所有內容,而不僅僅是恢復我的警報功能,但也包括所有其他功能。 – FatDogMark

+0

@FatDogMark對不起,請問,但我需要知道你要去的地方有了這個,我需要一個具體的例子。 –

2

您可以從c包含myalert返回一個對象

0
c: function() { 
    return { 
     myalert : function() { 
      // whatever 
     } 
    } 
}, d: function() { 
    this.c().myalert() 
}