2016-08-17 7 views
-4

私はnode.jsに関する本を読んでいるうちに、javascriptを学び始めています。最初の例の1つでは、高次関数を示しています。javascriptでは、fooが関数の場合、foo()とfooの違いは何ですか?そして、高次関数にargとして渡されたときにどう違いますか?

setTimeout(function() { 
    console.log('2000 milliseconds have passed since this demo started'); 
}, 2000); 

これはREPLで実行するときに機能します。それは2秒待ってから、私が与えた文字列を書き込む。

setTimeout(console.log('2000 milliseconds have passed since this demo started'),2000); 

これはすぐに文字列をプリントアウト:

は、だから、私は同じ出力を生成する期待何かをやってみました。私はsetTimeoutがまだ待っていて、2秒後に何もしなかったと推測しています。何らかの理由で最初に文字列を印刷しました。

私はそれを周りにもう少しを果たし、単なる文字列を出力する別の関数を作成しました:

function tester() { 
    console.log('tester function ran'); 
} 

私は、その後のsetTimeoutの内部でこの関数を呼び出した:

setTimeout(tester(),2000); 

それはまだ文字列を印刷テスター()で最初に出てから2秒待ってから何もしなかった。

私は、括弧を削除しようとした:

setTimeout(tester,2000); 

は、これが "働いていました"。それは2秒間待ってからテスター()に文字列を印刷した。

ここで私の質問は、この文脈でテスター()とテスターの違いは何ですか?これは、高次関数setTimeout()の内部で関数に引数を渡すことができないことを意味しますか?もしそうなら、なぜですか?

+0

foo()を使用しているとき - fooだけを使用しているときにメソッドを呼び出すと、後で呼び出されるメソッドへの参照が渡されます。 (あなたが設定した遅延が終了したら) –

+0

... 1つは関数を呼び出し、もう1つはそうではありません....そしてはい、setTimeoutの関数に引数を渡すことができます。 –

答えて

-2

setTimeout(tester(),2000);の場合は、実際にメソッドテスターを呼び出しています。コールバックがないので、何もしません。

setTimeoutは、コールバックメソッドを最初のパラメータとして想定しています。これは、setTimeout(tester,2000);を呼び出すときに渡されるものです。

基本的には、名前を指定するだけでメソッド定義を参照しています。しかし、テスター()はメソッド呼び出しです。

以下の定義方法のスタイルを参照してください。つまり、テスターは実際にメソッド定義であることが明確になります。

var tester = function(){ 
} 

1

ここで私の質問は、この文脈でテスター()とテスターの違いは何ですか?

fooが関数として評価される。

foo()は、(引数なしの)関数を呼び出し、その戻り値として評価されます。

これは、高次関数setTimeout()の内部で関数に引数を渡すことができないことを意味しますか?

setTimeout、あなたは少なくともブラウザで見つけるの実装では、あなたはsetTimeoutへの呼び出しの第三、第四、などの引数に関数に渡される引数を指定することができます。指定された引数で既存の関数を呼び出す以外は何もしない新しい関数を作成することもできます。 bindメソッドはこれを簡単にします。

0

fooは、関数そのものへの参照であり、foo()は関数が何を返しても関数を呼び出します。

関連する問題