2017-08-08 14 views
2

私は関数型プログラミングの新人です。次の関数で実際に何が起こっているのかを理解するために大きな問題があります。Javascript高次関数

const someFnc = arg => arg("You can print that string :)"); 
someFnc(msg => console.log(msg)) 

実際に関数someFncに関数を渡すことがわかります。しかし、関数argはarg(...)(私の例では文字列の引数を使って)としてどのように自己呼び出すことができますか? 私はその概念に本当に混乱しています。

+1

'arg'は自己起動しません。呼び出しは 'someFnc'(' arg( "あなたはその文字列を出力できます:) :)") 'の関数本体にあります。 – Xufox

+1

「自己呼び出し」という言葉が何であるか分かりません。 'someFnc'は、実行時にパラメータとして宣言された関数' arg'を呼び出します。 – Bergi

答えて

3

あなたはそれをばらばらにした場合、あなたは何が起こっているのを見ることができます。

function someFunction(fn) { 
    fn('hello') 
} 

function logFunction(msg) { 
    console.log(msg) 
} 

someFunction(logFunction) 

は基本的に、someFunctionは関数であるべき引数(fn)をとります。

次に、その関数の引数として文字列("hello")を渡します(fn('hello'))。

someFunction受信した機能を実行するので、logFunction('hello')を実行しています。

logFunctionは、文字列引数とコンソールログを取ること(console.log('hello')

アロー機能((arg) =>は)function(arg) { }を記述するための速記です。

0
const someFnc = arg => arg("You can print that string :)"); 

を作成するだけで、匿名の方法です:あなたが定義

function someFnc (arg) { 
    arg("You can print that string :)"); 
} 

他の無名関数:

msg => console.log(msg) 

これはmsgを取り、コールにそれを使用していますanoynous機能させますconsole.log。最初の引数でconsole.logを呼び出すだけなので、何もしないラッパーです。あなたは確かにちょうどconsole.logでそれを置き換えることができます。

someFnc(console.log) 

は今ので、私たちはバインド変数に置き換える引数を持つ関数の本体で関数呼び出しを置き換えることができます置換規則を使用して:

arg("You can print that string :)");  // replace arg with console.log 
// === 
console.log("You can print that string :)"); 

JavaScriptでベアワードを書くと、parseIntのように変数になります。それは関数に評価されます。従ってparseInt("10"); // ==> 10。関数の本体でargは、オブジェクトの属性consoleの値を取得する変数です。 parseIntのような関数です。変数は値であり、関数も値です。

値を関数として渡すと、関数の定義内の変数にバインドされます。それも、既存の機能をシャドウすることができます

((parseInt, value) => parseInt(value))(Number, "10"); 
// => 10 

だから、ルールは、引数でバインドされた変数を置き換えている、ので、それは本当にです:

Numer("10"); //=> 10 

変数は、値のためだけの名前です。関数は、適用後に()を入れることができる値で、オプションで引数を指定します。

+0

_ "ちょうど匿名の方法" _ - ES 2015以降、上記のスニペットの関数は[推論された関数名](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/)を持ちますグローバル_オブ​​ジェクト/関数/名前#Inferred_function_names) 'someFnc'。 – Xufox

+0

@Xufoxはい、そうです。これは、パーサーが最も近いバインディングからの関数オブジェクトを装飾するが、割り当てられた式は無名関数を作成するデバッグをはるかに簡単にします。 IMO '((fun => fun.name)(()=> 1))'も 'fun 'を返す可能性がありますが、そうではありません。 – Sylwester

+0

msg => console.log(msg)ラムダ関数はラッパーではありませんか? – JtR