在Javascript中调用另一个函数内定义的函数

Mik*_*ike 33 javascript scope function

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

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

function outer() { 
    alert("hi");       
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,我得到一个警报:

现在当我喜欢这样的时候:

function outer() { 
    function inner() {
        alert("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

我为什么不收到警报?

虽然内部函数具有外部函数的范围.

tec*_*bar 41

正如您所指出的那样,范围是正确的.但是,您不是在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
}
Run Code Online (Sandbox Code Playgroud)

要么

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

<input type="button" onclick="(new outer()).inner();" value="ACTION">?
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句叫做onclick ="(new outer()).inner();",这是我第一次看到它 (2认同)
  • @Mike:最好忘了它,它并不适合这个.他正在创建一个`outer`构造函数的新实例,并在其上调用一个方法 (2认同)

Mat*_*mes 37

你可以将它变成一个模块,并通过在Object中返回它来公开你的内部函数.

function outer() { 
    function inner() {
        console.log("hi");
    }
    return {
        inner: inner
    };
}
var foo = outer();
foo.inner();
Run Code Online (Sandbox Code Playgroud)

  • 标记答案的第一部分是针对此特定问题的正确答案,但是Google将我带到了这里,而这正是我在寻找的内容,它是在搜索:“ javascript访问函数内部的函数”。我猜这就是为什么这个问题有很多赞成票的原因,尽管这个问题是错误的。 (2认同)
  • 也可以`return {inner}` (2认同)

Esa*_*ija 6

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

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

    inner(); //Call the inner function

}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

var fname;

function outer() {
    function inner() {
        console.log("hi");
    }
    fname = inner;
}
Run Code Online (Sandbox Code Playgroud)

现在只是

fname();
Run Code Online (Sandbox Code Playgroud)


Tha*_*eez 5

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

function outer() {
  return (function inside(){
    console.log("Inside inside function");
  });
}
outer()();
Run Code Online (Sandbox Code Playgroud)

或者

function outer2() {
    let inside = function inside(){
      console.log("Inside inside");
    };
    return inside;
  }
outer2()();
Run Code Online (Sandbox Code Playgroud)