bind.apply()这种用法具体怎么执行的?

walden
  • 51
function add (a, b) {
  return a + b;
}

var make_lazy = function (fn) {
  return fn.bind.apply(fn, arguments);      //??? 不理解这一行
};

var lazy_value = make_lazy(add, 2, 3);

lazy_value()        // => 5

apply() call() bind()的基础用法,我明白。但是bind.apply()这样连用,就有点含混了。
大侠可否将那一行拆解开,讲解下,具体怎样一步步起作用的?

回复
阅读 4.3k
3 个回答
✓ 已被采纳

apply/call/bind都为函数对象的方法,
apply/call用于调用执行指定的函数,第1个参数执行函数执行时的上下文
bind方法为指定的函数对象创建一个新的函数,传入的第1个参数这个新函数执行时的上下文
bind方法可以理解为对apply方法的封装调用

var make_lazy = function (fn) {
  return fn.bind.apply(fn, arguments);      //??? 不理解这一行
};

1.fn.bind获取传入的函数对象的bind方法,和Function.prototype.bind等价
2.调用apply方法,将fn作为bind方法调用时的函数对象(也即bind方法调用时的this对象)
3.bind方法从第2个参数开始可以传入多个参数,所以使用make_lazy方法调用时传入全部参数arguments做为apply方法的第2个参数,arguments中的第1个参数为fn

var make_lazy = function (fn) {
  var orgBindFun=Function.prototype.bind;  
  return orgBindFun.apply(fn, arguments);      
  //return fn.bind(fn, arguments0, arguments1, arguments2....);//类似这样,将参数拆开
};
Honwhy
  • 7k

1替代思考

照着调用替换一下参数可得

return add.bind.apply(add, arguments);

2回忆比较

一般借用方法的做法我们常见的有
Array.prototype.slice.apply(arguments)

function fn() {
  var a = Array.prototype.slice.apply(arguments);
  console.log(a);
}
fn(1,2,3); //[1,2,3]

3分析

可以这个题目的写法似乎是借用自己的方法
add.bind.apply是为add.bind指定另外一个this对象,而这个要被指定的对象恰好又是自己addbind的目的是构造一个新的方法,且有确定的this对象。
所以make_lazy最终目的是bind出来一个新的方法。
然后可以调用新的方法就可以获得结果,就是后面的
lazy_value()

4猜测

猜测这么做的目的(胡乱猜测的)
1.lazy求值
2.让add方法无状态

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏