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

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

ただいまの
回答率

90.84%

  • JavaScript

    14820questions

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

JavaScript bindメソッドについて

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 480

Behemoth

score 19

二次元配列を引数にとり、各配列の最大値を要素とする配列を返す関数を作れ、という課題がありました。
例)largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) should return [27,5,39,1001]

function largestOfFour(arr) {
  return arr.map(Function.apply.bind(Math.max, null));
}


模範解答の一つにこのようなものがありました。
基本的にはMath.max.apply(null, [9, 43, 20, 6])のような機能を実装しようとしているおようですが、「bind」の引数にnullを入れているのが腑に落ちません。
Math.maxをapplyのthisとし、nullがその第一引数となる、ということでしょうか?
Math.max.apply(null)
このようになると思うのですが、この場合、null以降の引数はどのようにして入れられるのですか?
支離滅裂になってしまいすみません。よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

まず、Function.prototype.applyは、引数を配列として与えて、それを多数の引数として元の関数に渡せるメソッドですが、これの第1引数はthisにする値、第2引数が引数の配列、という形で引数を取ります(MDN)。

そして、Array.prototype.mapは、第1引数に処理中の値、第2引数にインデックス、第3引数に配列全体を渡してきます(MDN)。

この引数位置のズレを解消するために、「Math.max.applyの第1引数を固定する」必要があるので、Function.prototype.applyを、bind経由で呼び出しています。

なお、Function自体も関数なので、Function.applyFunction.prototype.applyと同一の関数です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/25 10:54

    詳しいご回答ありがとうございます。
    map()についてですが、
    var array1 = [1, 4, 9, 16];

    // pass a function to map
    const map1 = array1.map(x => x * 2);
    \
    console.log(map1);
    // expected output: Array [2, 8, 18, 32]
    今回の場合、「map(x =>」の部分のように引数を指定する必要はないのはどうしてでしょうか?

    キャンセル

  • 2018/05/25 10:55

    なお、「null」で動いているのは「Math.maxがたまたまthisを使っていなかった」だけなので、本来thisになるべき「Math」を渡すことをおすすめします。

    キャンセル

  • 2018/05/25 10:56

    「x => x * 2」は(微妙な違いはありますが)「function(x){ return x*2 }」という関数の短縮形です。

    Function.bindで生成する結果も「関数」なので、mapにそのまま渡す必要があります。

    キャンセル

  • 2018/05/25 10:59

    承知しました。
    質問にも答えていただき、大変助かります。
    ありがとうございました。

    キャンセル

  • 2018/05/25 19:01

    質問者さんとは別の人が返事を…?

    キャンセル

  • 2018/05/25 19:20

    ほんとだ、気がつかなかった。

    第7条(禁止事項)
    登録ユーザーは、本サービスの利用にあたり、以下の各号のいずれかに該当する行為または該当すると当社が判断する行為をしてはなりません。
    ...
    (11) 複数のユーザーIDを1人で保有する行為
    https://teratail.com/legal

    複アカは規約違反です。ご注意されたい。

    キャンセル

  • 2018/05/25 19:43

    申し訳ありません。
    消しておきます。

    キャンセル

+1

applyの第一引数はthisObjだから、Math.max.apply(null, [9, 43, 20, 6])Math.max([9,43,20,6])と解釈されると思います。Math.max()はthisを参照しないでしょうし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/25 10:55

    ありがとうございます。
    null,undefinedにするとglobalObjectをthisとみなすということですか?

    キャンセル

  • 2018/05/25 11:45

    > globalObjectをthisとみなす
    仕様上そうですね(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)

    私が書いたのは、質問者さんが、Math.max.apply(null, [9, 43, 20, 6])はMath.max.apply(null)になると認識されていた(がゆえに奇妙に思われていた)ことへの回答なので、globalObjectがthisにあると理解のある方には、無用の回答かと思います。

    キャンセル

  • 2018/05/25 11:45

    参考までに、おそらくの出典
    https://forum.freecodecamp.org/t/chaining-function-apply-bind-in-return-largest-number-in-arrays/105438

    キャンセル

  • 2018/05/25 19:18

    ご返信が遅くなりました。
    リンク、ありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    14820questions

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