2012-12-03 239 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() 
}