2017-02-19 8 views
0

私は最近javascriptで関数式と宣言を読んでおり、これについてはかなりのオンライン記事を参照しています。私はまた、SOに関するこのトピックについての議論もかなり見てきました。学習の過程で、私は挑戦で自分自身に任せました。私はそれを明確に説明することはできません。 私はここでいくつかの洞察を得るのを助けるためにSOの専門家に親切にリクエストできますか?ここでJavascriptの関数式の使用例

が問題のシナリオである -

シナリオ1:

>var multFunc=function(n){var a=2; return n*a;} 
    >multFunc(6)  
    12 

私は、このシナリオを理解し、その結果は、私は(12)を期待していたものです。

シナリオ2:

>var multFunc1=function(n){return function(n){n*2}} 
>multFunc1(6) 
function (n){n*2} 

私は2番目のケースを理解していませんでした。それはなぜ12を返さないでしょうか? 誰かがこれを理解するのを手伝ってもらえますか? 私は、このリンクをチェックしている - Javascript Function Expressions、このリンクJavaScript Nested function をし、私も昨日同様の質問をしましたが、私は(TJで丁重に説明したように)私は完全に概念を把握していなかったと思います - Trying a closure the wrong way?

+3

'multFunc1'は関数を返すので、' 12'を得るには 'multFunc1()(6)'を実行する必要があります。 – 4castle

+0

さらに、@ 4castleは、 'multFunc1'に渡された引数は使用されていないことに注意してください。*で示されている内部関数は常に' undefined' *を返します( 'return'文はありません)。 – nnnnnn

+0

@ 4castle .. multFunc1()(6)コールは実際には未定義を返します。私は実際にそれを実際に試してみました –

答えて

1

2番目のシナリオで本質的に何をしているのかは、関数オブジェクトを返すことです。関数の実行結果(通常は12)を返すのではなく、参照をそのオブジェクトに返すだけです。

更新: 私は、2番目の関数の中にreturn文がないと思います。それを追加することで、これはあなたが探していると信じている結果をもたらす。

var multFunc1=function(n){ 
    return function(n){ return n*2} 
} 

// The first set of() require no argument as 
// they are never used withing the second function. 
multFunc1()(6); 
+1

'maltFunct1()(6)'は 'undefined'を返します。 (内部関数は常に 'undefined'を返す) – nnnnnn

+0

私のせいで、それを指摘してくれてありがとう。私はそれを完全に見落としました.. –

+0

2番目のケースでは、返されたfuntionオブジェクトへの参照は、パラメータ自体で参照自体から関数を呼び出せませんか? –

2

コードを:

var multFunc1=function(n){return function(n){n*2}} 

は関数を返します。だから、multFunc1は、この場合には、返される関数を表しますので、あなたのよう呼び出すためにしていた

function(n){n*2} 

multFunc1(1)(2) 

だから、基本的に返される関数はn(渡された引数の値を覚えて、私はあなたをお勧めします閉鎖について読む)。

var multFunc1=function(n){return function(x){n*x}} 
var multBy2 = multFunc1(2) 
var multBy16 = multFunc1(16) 

multBy2(4) // 8 
multBy16(2) // 32 

サイドノート:だから我々は、などの呼び出しを再作成することができ、それは常にundefinedを返すよう@nnnnnnはコメントで指摘したように、内側機能multFunc1さんは、どんなreturn文を持っていない

+1

表示された内部関数は常に 'undefined'を返します。 – nnnnnn

+0

@Antの答えに感謝しますが、あなたはこの答えについて確信していますか?まずこの呼び出し - multFunc1(1)(2)は未定義を返します。そして、もし私がこれを行うならば、var multFunc1 = function(n){return function(n){n * 2}}そしてvar multBy2 = multFunc1(2); multBy2(4)コールは未定義を返します。 –

+0

@ShibasisSengupta:私の答えを完全にチェックしてください。あなたは 'return'ステートメントを見逃しました。理由はあなたが'未定義 'になっているということです。 –

関連する問題