質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1105閲覧

apply関数に関して。

tkshp

総合スコア174

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2018/11/27 10:14

編集2018/11/28 01:43

前提・実現したいこと

apply関数に関して、4点、質問があります。

1点目。
apply関数とcall関数で、共に第1引数だけしか指定しない場合、thisの置き換えしか行わないから、挙動は全く同じという認識で合っていますか?

2点目と3点目。
Math.max.apply(null, array)
というコードをよく見かけるので、下記のように試してみました。

const array = [1,2,6,3,10,2,5]; console.log(Math.max.apply(null, array)); //10

2点目。
第1引数にnullを渡しているのは、Math.max関数の中でthisを使う処理が無いからという解釈で合っていますか?

3点目。
applyによって第2引数の配列のarrayがMath.maxの引数に渡るとき、
[1,2,6,3,10,2,5]が(1,2,6,3,10,2,5)という引数に変換されて渡っているという認識で合っていますか?

4点目。
call関数でMath.maxを使う書き方を見たことないのですが、
もし書くとしたら、下記のようになると思いますが、
call関数使ってMath.max使うぐらいなら、普通にMath.max関数使った方がコードが短くなるから、
call関数でMath.maxを使う書き方はしないという認識で合っていますか?

console.log(Math.max.call(null, 1,2,6,3,10,2,5)); //10 console.log(Math.max(1,2,6,3,10,2,5)); //10
set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Math.max()

Math.max() は可変長引数をとれる静的関数です。

JavaScript

1Math.max(1, 2, 3, 4); // 4

Function.prototype.call()

Function.prototype.call() は第一引数に this 値を指定し、第二引数以降は元の関数と同じ指定として扱います。

JavaScript

1Math.max(1, 2, 3, 4); // 4 2Math.max.call(null, 1, 2, 3, 4); // 4

上記2行のコードは this 値が異なる以外は同じ処理です(Math.max は this 値を利用しません)。

Function.prototype.apply()

Function.prototype.apply() は第一引数に this 値を指定し、第二引数以降は元の関数で指定する「可変長引数」を「配列」として扱います。

JavaScript

1Math.max(1, 2, 3, 4); // 4 2Math.max.apply(null, [1, 2, 3, 4]); // 4

上記2行のコードは this 値が異なる以外は同じ処理です(Math.max は this 値を利用しません)。

JavaScript

1Math.max(1, 2, 3, 4); // 4 2Math.max(...[1, 2, 3, 4]); // 4

上記2行のコードは完全に同じ処理です。

call関数使ってMath.max使うぐらいなら、普通にMath.max関数使った方がコードが短くなるから、

通常は Math.max(1, 2, 3, 4) で十分なので、Math.max.call(null, 1, 2, 3, 4) の出番はありません。

Re: tkshp さん

投稿2018/11/27 11:53

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2018/11/28 01:43

ご回答ありがとうございます。 勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

1点目
内部的にはわかりませんが、利用する上での挙動は同じです。

2点目
はい、Math.max()はコンテクストに依存しないので、何でも大丈夫です。
実行される関数がストリクトモードでない場合に、第1引数にnullまたはundefinedを指定するとthisはグローバルオブジェクトになります。

3点目
はい、合っています。

4点目
はい、そうです。
Math.max()Function.prototype.apply()で呼び出すのは、配列を引数に渡せるからです。
Function.prototype.call()だとメリットがないですね。

投稿2018/11/27 11:26

NozomuIkuta

総合スコア1260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2018/11/28 01:44

ご回答ありがとうございます。 Yes,Noで明確にお答えいただき、疑問が解消しました。 ありがとうございます。
NozomuIkuta

2018/11/28 11:46

解決したようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問