2

いくつかのJavaScriptを使用しているときに、不可解な動作に遭遇しました。何が起こっているのかを説明するドキュメントを探しています。

問題は、関数がどのように渡されるかによって、関数が単なるパラメーターであると思われるときに実行される可能性があることです。

簡単な例を次に示します。

function f1()
{
    alert('f1');
}
function f2()
{
    alert('f2');
}
function f3(a, b)
{
    alert('f3');
}

上記の呼び出しの 2 つのバージョン:

f3(f1, f2);        // shows 1 alert
f3(f1(), f2());    // shows 3 alerts

上記の f3 の最初の呼び出しでは、f1 および f2 関数が呼び出されず、"f3" のアラートが 1 つ表示されます。f3 関数の 2 回目の呼び出しが呼び出されるため、"f1"、"f2"、"f3" の 3 つのアラートを受け取ります。

実際のコードでは、f3 が f1 と f2 を呼び出すかどうかを決定できるように、最初のバージョンを使用します。それを正しくするのに少しいじりました。

私はこの動作を予期していませんでした。また、括弧の有無にかかわらず、f1 と f2 をパラメーターにするだけでは呼び出されないだろうと考えました。

繰り返しますが、これがどのように機能するかを説明するドキュメントを探しています。

4

4 に答える 4

2

2行目で:

f3(f1(), f2());

あなたはandを渡し ていません。あなたはそれらを呼び出しており、それらの (未定義の) 戻り値を に渡しています。f1f2f3

于 2013-06-29T21:27:18.887 に答える
1

簡単に言えば、() を関数に追加すると、パラメーターとして渡す場合でも、関数がすぐに呼び出されます。タイムアウトの設定例:

function doStuff() {
    alert("ok");
}

setTimeout(doStuff(), 300);

ok関数はすぐに呼び出されるため、すぐにアラートが表示されます。次の方法でタイムアウトを設定します。

setTimeout(doStuff, 300);

関数をパラメーターとして正しく渡しているため、タイムアウトが呼び出されたときにのみアラートが表示されます。

AJAX コールバック関数では、このようなパラメーターとして関数が渡されることがよくあります。

のドキュメントにsetTimeoutは、コールバック関数に関する優れたセクションがあります: https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

(はいsetTimeout、質問で使用されていないことは理解していますが、この例は質問にうまく答えるのに役立つと感じました)

于 2013-06-29T21:26:14.807 に答える
0

関数にパラメーターがある場合、括弧を使用してすぐに呼び出すことは非常に明確です

function sum(a, b){
    return a + b;
}

console.log( sum(1, 2) ); //prints 3

f()バージョンは、パラメーター リストが空の特殊なケースです。

于 2013-06-29T21:29:03.883 に答える
0

あなたの論理は不可解です。使用したことのないパラメーターを渡していますが、パンチで転がしましょう。

あなたの質問はアラームの数に関するものです。パラメータを使用しない関数にパラメータを渡し、それを呼び出します。実際に何が起こるかは次のとおりです。

function f3(a, b)
{
console.log("argument 1: " + arguments[0]); //Access the arguments fed to the function
console.log("argument 2: " + arguments[1]); 
    alert('f3');
}
*

f3(f1, f2); ポップアラート「f3」*

and logs:
argument 1: function f1()
{
    alert('f1');
}
argument 2: function f2()
{
    alert('f2');
}

f3(f1(),f2())

すべてのアラート とログをポップします。

argument 1 undefined
argument 2 undefined
于 2013-06-29T21:23:49.963 に答える