2017-09-09 6 views
0

誰かが文字列配列に対してapplyメソッドを正しく使用できない理由を私に説明することはできますか?文字列配列に適用メソッドを使用する方法は?

function speak(line) { 
    console.log(line); 
} 
var whiteRabbit = {type: "white", speak: speak}; 
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]); 

出力がBurpであるのはなぜですか?どのように適用メソッドでそれを達成するには?

+0

fatRabbitとは何ですか? – marvel308

+0

申し訳ありませんが、それはwhiteRabbitでなければなりません....どうすれば修正できますか? –

答えて

1

Function#applyは、唯一のパラメータがlineであるため、配列内の最初の項目が割り当てられ、残りは無視されます。

はところでからspeak機能はどのような方法でthisを使用していないので、applyの第一パラメータは、この場合には重要ではありません。

あなたはそれがどのように動作するかを見ることができる機能によりのparamsを追加します場合:

function speak(a, b, c) { 
 
    console.log(a, b, c); 
 
} 
 

 
speak.apply(null, ["Burp!","Skree","Hello"]);

あなたは未知の長さの配列を表示する必要がある場合は、それが起動する方が良いでしょう関数をFunction#callを使用して実行し、配列を反復処理するか、または表現可能なものに変換します。例えば:Function#applyから

function speak(arr) { 
 
    console.log(arr.join(' ')); 
 
} 
 

 
speak.call(null, ["Burp!", "Skree", "Hello", "Cats"]);

1

apply()方法は、所与のthis値を持つ関数を呼び出し、そしてargumentsアレイ(又はarray-like object)として提供します。

配列の最初の要素だけをパラメータlineとして使用します。より多くのパラメータを取ると、残りの配列も見ることができます。

function speak(line, line1, line2) { 
 
    console.log(line); 
 
    console.log(line1); 
 
    console.log(line2); 
 
} 
 

 
var whiteRabbit = { 
 
    type: "white", 
 
    speak: speak 
 
}; 
 

 
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

あなたは配列として値を使用したい場合は、argumentsを使用して値を反復yould。

function speak() { 
 
    Array.prototype.forEach.call(arguments, function (s) { 
 
     console.log(s); 
 
    }); 
 
} 
 

 
var whiteRabbit = { 
 
    type: "white", 
 
    speak: speak 
 
}; 
 

 
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

ウィットES6私はfatRabbitwhiteRabbitであることを意味していると仮定しようと、あなたの質問があることだrest parameters ...

function speak(...args) { 
 
    args.forEach(s => console.log(s)); 
 
} 
 

 
var whiteRabbit = { 
 
    type: "white", 
 
    speak: speak 
 
}; 
 

 
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

+0

答えをありがとう!動的にするにはarguments.lengthを使うべきです。右? –

+0

@rajeev、またはより良いrest/spread構文: 'function speak(... args){console.log(... args);}' –

0

を使用することができますなぜあなただ​​けが表示されます完全配列の代わりにとなります。

理由はapply離散引数であなたの関数を呼び出すために、配列を使用するため、最初のエントリはlineパラメータとして表示され、あなたがそれらのパラメータを持っていないので、あなたが他の人を見ていないということです。

アレイを表示する場合は、applyではなくcallを使用してください。方法(speak(line1, line2, line3))における複数のパラメータを追加、あるいは

function speak(line) { 
 
    console.log(line); 
 
} 
 
var whiteRabbit = {type: "white", speak: speak}; 
 
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);

:次いでlineは配列だけでなく、最初のエントリを参照します。コメントで


、あなたが求めてきました:

は、あなたはそれを動的に作成する方法を示しすることはできますか?

により「ダイナミック」あなたはそれを取得として、それはできるだけ多くのエントリをログに記録します意味、私はcall(上記のように)、ループを使用したい場合は、次の使用だと

function speak(lines) { 
 
    lines.forEach(function(line) { 
 
     console.log(line); 
 
    }); 
 
} 
 
var whiteRabbit = {type: "white", speak: speak}; 
 
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);

forEachでも、you have lots of other optionsである。あなたも、コンテキストを変更したい場合は

["Burp!","Skree","Hello"].forEach(speak); 

:あなたはウサギが次々と言葉を言わせてそれ以上のパラメータ

function speak(line, line2, line3) { 
 
    console.log(line, line2, line3); 
 
} 
 
var whiteRabbit = {type: "white", speak: speak}; 
 
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]);

+0

あなたの答えをありがとう!あなたはそれを動的にする方法を示すことができますか? –

+0

@RajeevHanda:「ダイナミック」とはどういう意味ですか? –

+0

@RajeevHanda:私はあなたが上記のダイナミックなことを推測しました。 –

0

["Burp!","Skree","Hello"].forEach(word => speak.call(rabbit, word)); 
0

を追加する必要が

関連する問題