web-dev-qa-db-ja.com

JavaScriptの別の関数内で定義された関数を呼び出す

私はこのようなボタンをクリックして関数を呼び出しています:

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

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

それはうまく機能し、アラートを受け取ります:

今、私はこれが好きなとき:

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

アラートが表示されないのはなぜですか?

ただし、内部関数には外部関数で使用可能なスコープがあります。

30
Mike

ご指摘のとおり、スコープは正しいです。ただし、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">​
36
techfoobar

これをモジュールにして、Objectに返すことで内部関数を公開できます。

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

関数innerを呼び出すのではなく、定義するだけです。

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

    inner(); //Call the inner function

}
6
Esailija

これを試すこともできます。ここでは、関数の「内部」を返し、2番目のかっこで呼び出しています。

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

または

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