天天看點

es6 javascript 函數綁定

箭頭函數可以綁定this對象,大大減少了顯式綁定this對象的寫法(call、apply、bind)。但是,箭頭函數并不适用于所有場合,是以 ES7 提出了 “ 函數綁定 ” ( function bind )運算符,用來取代call、apply、bind調用。雖然該文法還是 ES7 的一個提案,但是 Babel 轉碼器已經支援。

函數綁定運算符是并排的兩個雙冒号( :: ),雙冒号左邊是一個對象,右邊是一個函數。該運算符會自動将左邊的對象,作為上下文環境(即 this 對象),綁定到右邊的函數上面。

foo::bar;
//  等同于
bar.bind(foo);
foo::bar(...arguments);
//  等同于
bar.apply(foo, arguments);
const hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn(obj, key) {
return obj::hasOwnProperty(key);
}
           

如果雙冒号左邊為空,右邊是一個對象的方法,則等于将該方法綁定在該對象上面。

var method = obj::obj.foo;
//  等同于
var method = ::obj.foo;
let log = ::console.log;
//  等同于
var log = console.log.bind(console);
           

由于雙冒号運算符傳回的還是原對象,是以可以采用鍊式寫法。

//  例一
import { map, takeWhile, forEach } from "iterlib";
getPlayers()
::map(x => x.character())
::takeWhile(x => x.strength > 100)
::forEach(x => console.log(x));
//  例二
let { find, html } = jake;
document.querySelectorAll("div.myClass")
::find("p")
::html("hahaha");
           

繼續閱讀