JavaScript爲何屢次綁定只有一次生效?

接上篇文章JavaScript重識bind、call、applybash

一、 先看一段代碼:

function foo() {
    console.log("name: " + this.name);
}
var obj = { name: "obj" }, obj2 = { name: "obj2" }, obj3 = { name: "obj3" };
foo.bind(obj).call(obj2)  // name: obj
foo.bind(obj).bind(obj2)()  // name: obj
複製代碼

因此爲何bind只有第一次bind生效呢?app

解釋

這裏想簡單解釋一下; foo.bind(obj).bind(obj2)() 從左到右執行;函數

  1. foo.bind(obj) 返回一個函數,這個函數其實回去執行 apply的操做,叫foo1; 那麼在此次綁定是的是 foo.apply去綁定 obj;
  2. 而後 foo.bind(obj) 返回的這個函數,咱們暫且稱做fooB, 而後fooB.bind(obj2)又會返回一個要去執行apply的函數,叫 foo2; 就是foo.bind(obj).bind(obj2)了
  3. foo.bind(obj).bind(obj2)();

bind分解.png post

結論

因此不管foo執行多少bind 都是第一次bind的對象!this

後面的bind只能改變上一個bind的this指向,例如foo.bind(obj).bind(obj2) 改變的是 foo.bind(obj)的this指向是obj2; 最終foo執行是的綁定的this是由第一次bind的對象決定,即foo.bind(obj)的objspa

相關文章
相關標籤/搜索