【JSリファレンス】Bound Functionエキゾチックオブジェクト

更新日:2024/06/14

Bound Functionエキゾチックオブジェクトは、Function.prototype.bind()によって生成されるオブジェクトです。

内部値として、次の値を持っています。

内部値内容
[[BoundTargetFunction]]呼び出す関数オブジェクト
[[BoundThis]]this値
[[BoundArguments]]引数

Bound Functionエキゾチックオブジェクトに ( )を記述すると、[[BoundTargetFunction]]が実行されます。
このとき、this値として[[BoundThis]]が、引数として[[BoundArguments]]の後に、関数呼び出し時に記述した引数が連結して渡されます。

const f = function(a,b=10){
  return this.value * a * b;
}
 // this値{ value:2}、最初の引数を2で固定
const o = { value:2};
const param1 = 2;
const fb = f.bind( o , param1 );

const obj = {
  value:10,
  func1:f,
  func2:fb
}

console.log( obj.func1(  3 ) ); 
  // 300 ← obj.value(10) * 3 * 10

console.log( obj.func2(  3 ) ); 
  // 12 ← o.value(2) * param1(2) * 3

またBound Functionエキゾチックオブジェクトのプロトタイプは、Functionコンストラクターを継承しています。
そのためFunctionオブジェクトで使用できるメソッドを呼び出すことができます。

ただし、bind()Bound FunctionエキゾチックオブジェクトからBound Functionエキゾチックオブジェクトを生成した場合、最初のBound Functionエキゾチックオブジェクトのthis値と引数が優先されます。

またapply()およびcall()呼び出しも、最初のBound Functionエキゾチックオブジェクトのthis値と引数が優先されます。
※引数は優先順に連結されます。

const f = function(a,b=10){
  return this.value * a * b;
}
const f1 = f.bind( { value:2} , 3 , 4 );
const f2 = f1.bind( { value:20} , 30 , 40 );
  // 同じ結果になる(最初のbindが優先)
console.log( f1() );  // 24
console.log( f2() );  // 24
console.log( f2.call({value:0.5} , 0.1 , 0.3 ) ); // 24

これは、次のように[[BoundTargetFunction]]が入れ子になっているからです。

f2{
 [[BoundThis]]: { value:20}      // ←┬─ ① f1({ value:20},30,40) 
 [[BoundArguments]]: [30 , 40]   // ←┘    が呼び出される

 [[BoundTargetFunction]]:f1(){

   [[BoundThis]]: { value:2}     // ←┬─ ② f({ value:2} ,3,4,30,40 ) 
   [[BoundArguments]]: [3 , 4]   // ←┘    が呼び出される

   [[BoundTargetFunction]]:f(){
        return this.value * a * b;
   }
 }
}

更新日:2024/06/14

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。