JavaScript - 如何调用函数内的函数?

时间:2010-05-17 16:16:34

标签: javascript

我有以下JavaScript代码:

function parentFunc() {

    function childFunc() {
        ...
    }

    ...
}

// outside of myParentFunc, how do I call myChildFunc() ?
childFunc(); // doesn't work

如何从childFunc()以外的地方拨打parentFunc()

更新

我知道明显的答案是将childFun移到parentFun之外,但这是我无法修改的第三方库。

8 个答案:

答案 0 :(得分:3)

请参阅exposing inner functions外部世界。

答案 1 :(得分:2)

这是你可以做到的一种方式。

var myChildFunction;

function myParentFunc() {
  //....
  myChildFunction = function () {
    //....
  }
  myChildFunction();
}

myChildFunction();

这是另一种方式

var myChildFunction = function () {
  //....    
}


function myParentFunc() {
  //....
  myChildFunction();
}

myChildFunction();

答案 2 :(得分:2)

您可能需要考虑使用Yahoo Module Pattern代替:

myModule = function () {

    //"private" variables:
    var myPrivateVar = "I can be accessed only from within myModule."

    //"private" methods:
    var myPrivateMethod = function () {
        console.log("I can be accessed only from within myModule");
    }

    return {
        myPublicProperty: "I'm accessible as myModule.myPublicProperty."

        myPublicMethod: function () {
            console.log("I'm accessible as myModule.myPublicMethod.");

            //Within myModule, I can access "private" vars and methods:
            console.log(myPrivateVar);
            console.log(myPrivateMethod());
        }
    };
}();

您定义的私人会员定义了myPrivateVarmyPrivateMethod,以及定义myPublicPropertymyPublicMethod的公开会员。

您可以按如下方式访问公共方法和属性:

myModule.myPublicMethod();    // Works
myModule.myPublicProperty;    // Works
myModule.myPrivateMethod();   // Doesn't work - private
myModule.myPrivateVar;        // Doesn't work - private

答案 3 :(得分:2)

如果绝对无法修改代码,则无法执行此操作。否则,通过更改行

将内部函数指定给您可以访问的内容
function childFunc() {

,比方说,

window.cf = childFunc() {

然后您可以通过cf变量访问该函数。 (还有很多其他方法可以做到这一点;这是需要对第三方代码进行最少更改的方法。)

答案 4 :(得分:1)

有一种方法可以非常简单地完成这项工作,但这也是一种非常糟糕的做法。但是,因为OCCATIONALLY全局变量很方便,所以我会提到这一点。请注意,在您描述的情况下,这不是使用全局变量的好例子。

以下代码可以使用,但可怕代码

function parentFunction() {
    ...
    childFunction = function() {
    ...
    }
}

childFunction();

你正在使childFunction全局化,这通常是一个可怕的想法。使用命名空间是一种绕过全局变量精神错乱的方法。

ABV = {};
ABV.childFunction = function() {
    ...
}
ABV.parentFunction = function() {
    ...
    ABV.childFunction();
    ...
}
ABV.childFunction();

这就是像DWR这样的库的工作方式。他们使用1个全局变量并将所有子项放在一个全局变量中。

考虑范围如何在JavaScript中工作非常重要。如果你开始抛出全局变量,你一定会遇到很多麻烦。从您使用的示例中可以清楚地看到,您需要一类可以从任何地方调用的“函数”。希望有所帮助。

答案 5 :(得分:0)

只需在函数o_O

之外声明它

好吧,如果库没有提供方法,请修改它并使用.js上传它,可能是库不允许你这样做,因为你不应该这样做。

答案 6 :(得分:0)

以下是您可以做的事情:

将内部函数附加到global:

function parentFunc() {

   window.childFunc = function(){

   }

}

虽然这是一种贫民窟:)

所以我会使用一些更复杂的OO模式,例如模块模式:

function parentFunc() {

   var someVar;

   var childFunc = function(){

   };


   return {
      childFunc,
      someVar
   }

}

parentFunc.childFunc();

这样您就可以返回内部函数和返回值。

请记住,您不能调用内部函数的事实是JS的一个特性而不是限制。

答案 7 :(得分:-1)

function parentFunc() {

    var childFunc = function() {
        ...
    }

    ...
}

childFunc(); // works