【问题标题】:Calling a Function defined inside another function in Javascript在 Javascript 中调用另一个函数中定义的函数
【发布时间】:2012-11-04 12:22:31
【问题描述】:

我在点击按钮时调用一个函数,如下所示:

<input type="button" onclick="outer();" value="ACTION">​

function outer() { 
    alert("hi");       
}

它工作正常,我收到警报:

现在当我这样做时:

function outer() { 
    function inner() {
        alert("hi");
    }
}

为什么我没有收到警报?

虽然内部函数在外部函数中有一个可用的范围。

【问题讨论】:

  • 你在哪里尝试打电话给inner?

标签: javascript function scope


【解决方案1】:

你可以把它变成一个模块,并通过在一个对象中返回它来暴露你的内部函数。

function outer() { 
    function inner() {
        console.log("hi");
    }
    return {
        inner: inner
    };
}
var foo = outer();
foo.inner();

【讨论】:

  • 标记答案的第一部分是这个特定问题的正确答案,但谷歌把我带到了这里,这实际上是我正在寻找的,搜索:“javascript access a function inside a function。 "我猜这就是为什么这个问题有这么多赞成票,即使这个问题是错误的。
  • 非常感谢!我一直在寻找这个答案一段时间。 :D
  • 也可以return { inner }
【解决方案2】:

正如您所指出的,范围界定是正确的。但是,您不会在任何地方调用inner 函数。

您可以:

function outer() { 

    // when you define it this way, the inner function will be accessible only from 
    // inside the outer function

    function inner() {
        alert("hi");
    }
    inner(); // call it
}

或者

function outer() { 
    this.inner = function() {
        alert("hi");
    }
}

<input type="button" onclick="(new outer()).inner();" value="ACTION">​

【讨论】:

  • 顺便说一句,onclick="(new outer()).inner();" 是什么,我第一次看到它
  • @Mike:最好忘记它,它并不适合这个。他正在创建outer 构造函数的新实例并在其上调用方法
  • @Mike - 如果您需要在outer() 之外访问inner(),第二种方式可以让您使用。但是您在这里不需要第二种方式来满足您的要求。
【解决方案3】:

你没有调用函数inner,只是定义它。

function outer() { 
    function inner() {
        alert("hi");
    }

    inner(); //Call the inner function

}

【讨论】:

    【解决方案4】:

    你也可以试试这个。这里你将返回函数“内部”并使用第二组括号调用。

    function outer() {
      return (function inside(){
        console.log("Inside inside function");
      });
    }
    outer()();
    

    或者

    function outer2() {
        let inside = function inside(){
          console.log("Inside inside");
        };
        return inside;
      }
    outer2()();
    

    【讨论】:

      【解决方案5】:

      同样,不是直接回答这个问题,而是通过网络搜索引导到这里。最终通过简单地将内部函数分配给全局变量来公开内部函数而不使用 return 等。

      var fname;
      
      function outer() {
          function inner() {
              console.log("hi");
          }
          fname = inner;
      }
      

      现在就

      fname();
      

      【讨论】:

        【解决方案6】:

        如果你想用“外部”函数调用“内部”函数,你可以这样做:

        function outer() { 
             function inner() {
                  alert("hi");
             }
             return { inner };
        }
        

        在“onclick”事件中,您可以像这样调用函数:

        <input type="button" onclick="outer().inner();" value="ACTION">​
        

        【讨论】:

          【解决方案7】:

          你也可以只使用 return:

             function outer() { 
              function inner() {
                  alert("hi");
              }
          return inner();
          
          }
          outer();
          

          【讨论】:

            【解决方案8】:
            function outer() { 
            
                function inner() {
                    alert("hi");
                }
                inner();
            }
            

            你应该试试这个

            【讨论】:

            • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
            【解决方案9】:

            在 JavaScript 中

            如果使用 ES6
            static 函数可以在 class 中使用

            如果使用 ES5
            经过几天的使用,下面是我想出的,
            它是最小的,也有很多便利:

            function MathFunctions() {
                let thefo = {}; // the functions object
            
                thefo.sum = sum = (a, b) => {
                    return a + b;
                };
                thefo.avg = avg = (a, b) => {            // name is repeated 2 times - minor inconvenience
                    return sum(a, b) / 2;                // calls sum, another function without using 'this'
                };
            
                return thefo;                            // no need to go down & export here always for each new function - major convenience
            }
            
            // Usage
            console.log(MathFunctions().sum(1, 2));
            console.log(MathFunctions().avg(1, 2));
            // OR
            const mf = MathFunctions();
            console.log(mf.sum(1, 2));
            console.log(mf.avg(1, 2));
            

            【讨论】:

              【解决方案10】:

              试试这个解决方案

              const greet = (greeting) => {
                  return function (name) {
                      console.log(`${greeting} ${name}`);
                  };
              };
              
              greet('Hi !')('JAHID');
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-04-10
                • 1970-01-01
                • 1970-01-01
                • 2015-08-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多