李志成的个人网站

李志成的个人网站

  • 博客
  • ·
  • 留言
  • ·
  • 友链
  • ·
  • 关于
  • ·
  • Rss

js模拟实现bind的函数

发表于2019-03-09 14:21:19分类于javascript0条评论阅读次数33

概述

实现bind函数,首先我们需要考虑的是这个函数应该是如何工作的。

例子:

function fn(i,j){
	console.log(this, i, j);
}
var _fn = fn._bind({a: 1}, 1, 2)
_fn() // 函数调用

由上面的例子可以看出,bind是在fn上进行调用的,并且调用后传入参数,并返回一个函数。

在这里我们可能会想到利用fn的原型来解决添加加这个函数,并且实现。

为什么用原型?

因为这个函数是会被多次调用的,如果重复生成,会浪费内存空间。所以放在函数的原型上是最合适的。

为什么不用fn.proto._bind进行绑定?

由于fn在生成之前是未知的,所以其他函数无法使用该自己定义的bind。所以不是很合理。

由于所有的函数对象的构造函数是Function,所以把bind绑定在Function上。

实现代码:

Function.prototype._bind = function(target, ...args){
    // 返回匿名函数
	return () => {
        // 使用箭头函数,使this指向fn函数
		// 调用call或者apply对目标this进行绑定 
		this.call(target, ...args)
	}
}
function fn(i,j){
	console.log(this, i, j);
}
var _fn = fn._bind({a: 1}, 1, 2)
_fn() // 函数调用

--发表评论--

🚀support markdown (* ̄▽ ̄*)ブ