this硬绑定( 二 )

最强大的一种方法是将包裹函数创建为可以重复使用的辅助函数,封装可重复使用的硬绑定 。
function ffun(v) {return this.a * v;}var obj5 = {a: 5,};var fn2 = function(fn, obj) {return function() {return fn.apply(obj, arguments);}}var bind = fn2(ffun, obj5);console.log(bind(10));//50由于硬绑定十分常用,但通过包裹函数创建可重复使用的硬绑定比较麻烦,所以ES5提供了一个实现相同功能的方法bind() 。用法如下:
function hfun(v) {return this.a * v;}var obj6 = {a: 6};var bind = hfun.bind(obj6);console.log(bind(4));//24可以看到,我们再无需构建一个包裹函数来手动调用call或apply方法,只需要提供调用者和绑定到调用者this的对象即可 。
我们可能发现了一个奇怪的现象,通过apply()和call()方法绑定的对象在传参给调用者时,需要设置一个参数占位,但bind()方法则不用,这是因为他们的返回值不同,bind()方法会返回一个经过硬编码的新函数,它会把传入参数设置为this的上下文并调用原始函数 。可以理解bind使用方法为bind(obj)(args) 。而对于call()和apply()方法而言,一旦调用此方法,就会立刻返回调用者函数的返回值,所以此时就需要同时传入参数给方法的参数占用符,然后被函数参数读取 。值得注意的是,bind方法的参数和call方法类似 。
【this硬绑定】

经验总结扩展阅读