bindを使った値の受け渡しは引数の順番に要注意!

2019/04/28

Javascript テクノロジー プログラミング

t f B! P L
javascriptのbind機能はインスタンスを利用する時にキチンと理解しておかなければいけません。 単なるthisの受け渡しだけであれば、そんなに難しくはないのですが、bindを通して値を受け渡したい時に、その引数の順番に注意しなければいけないという事がわかったので、その理解するプロセスを紹介しておきます。 ちなみに、以前にもbindの記事を書いているのですが、引数についてほとんど触れていなかったので今回はその記事の続きです。   [JavaScript] あまり使わないbind関数調査

サンプルソースコード

var a = function(){ this.name = "a"; this.type = "b"; this.value = "c"; }; a.prototype.view = function(str1,str2,str3){ this.name = str1; this.type = str2; this.value = str3; console.log(this.name +","+ this.type +","+ this.value); }; var b = new a; var c = "ccc"; var d = "ddd"; window.addEventListener("click" , (function(c,d,e){ this.view(c + String(+new Date()) , d + String(+new Date()) , e + String(+new Date()) ); }).bind(b,c,d) , false); # 画面をクリックした結果 > ccc1555977643826,ddd1555977643826,[object MouseEvent]1555977643826 上記プログラムをブラウザのデバッグコンソールに貼り付けて実行(enter)すると、画面をクリックする度にコンソールログが表示されるようになります。

解説

その際にクリックごとに送り込む値を変更するようにしているのですが、重要なのはbind(...)で受け渡している値と、function(...)で受け取っている引数に注目してみましょう。 今回はわかりやすいようにリクエストとレスポンスの値を合わせておいたので若干分かりやすくしているつもりです。

bind

bindで受け渡しの値を記述する場合に、先頭の値は、インスタンス(内部でthisに当たるobject)でその次の値からが受け渡しの値になります。

function

functionで受け取り引数をセットする場合に、bindの2番めからの値が受け取れる状態になります。 なので、以下のような構造になることに注意してください。
bind(a,b,c) -> function(b,c){this...}

応用編

上記はaddEventListenerに直接書き込みましたが、setTimeoutや、その他イベント時に便利に値受け渡しが可能になります。 基本的に無名関数&インスタンス処理で構成するのがメモリ状態や周辺関数を汚さない状態になるので、今どきのプログラム構造の書き方としてbindをうまく活用しましょう。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ