Funtion.prototype.bindのことについて


本当にFuntions.prototype.bindが分かりましたか?
まず面白い面接問題を見に来ました.
var x = 0
var func = function () {
    console.log(this.x)
}

var obj1 = { x: 1 }
var obj2 = { x: 2 }
var obj3 = { x: 3 }

var func1 = func.bind(obj1)
func1()

var func2 = func.bind(obj1).bind(obj2)
func2()

var func3 = func.bind(obj1).bind(obj2).bind(obj3)
func3()
出力は123ですか
答えは111です
なぜですか?MDNでは、bind関数に対して返した値は、指定されたthisと初期化パラメータによって改造された元関数コピーを返すと定義されています.これはビッドとコールの違いです.
ここでなぜ強調するのですか?bindとcallであって、appyではありません.bindとcallは別々にパラメータを伝達するので、appyは配列方式で伝達します.
appy、call、bindの違いを振り返ってみます.
// bind -       this          **     **
function.bind(thisArg[, arg1[, arg2[, ...]]])
// call -      **         **,         ,   undefined
function.call(thisArg[, arg1[, arg2[, ...]]])
// apply -  call
function.apply(thisArg, [argsArray])
定義から見ると、3つの関数の主な機能は、元の関数のthisを変更する方向である.
callとappyは直ちに実行して、改造後の関数の戻り値を呼び出しました.bindは、関数を改造し、改造したコピーを返しただけで、コピーは実行されていません.
この点を理解すれば、問題のfunc.bind(obj 1)を改造できます.
function () {
    console.log(obj1.x)
}
thisが取り換えられているので、この上で、thisの指し方を変える操作はもう有効になりません.つまり、後は勝手に彼がcall、appyまたはbindの答えに変えてもまだ111です.
参考資料MDN-Function.prototype.bind()