彻底搞懂JS bind

冴羽大佬分析bind连接:https://github.com/mqyqingfeng/Blog/issues/12
下面是菜鸡的逐句分析:

Function.prototype.bind = function(context) {
	// 判断是否是函数调用bind, 如果不是bind则抛出异常
	if(this instanceof !== 'function') {
		throw new Error('亲,只有函数才可以调用bind哦!')
	}
	// 因为arguments是一个伪数组,所以这样取值arguments,不包括第一个参数
	let arg = Array.prototype.slice.call(arguments, 1)   // 这个等价于 [...arguments].slice(1)
	// 将this保存,如果函数里面直接用this,会指向window
	let that = this
	//call 返回的是一个方法所以
	let fBound = function() {
		// 因为bind返回的是个函数,函数还可以第二次传参,secoundArg是第二次传入的参数
		let secoundArg = Array.prototype.slice.call(arguments)
		/*
		这里return为什么要判断呢?只用context, arg.concat(secoundArg)不行吗?
		不行,因为bind函数应用之后生成的函数可以直接使用,也可以new出来,那和bind有什么关系呢,bind的指针发了变化,如果是作为							 				   普通函数的使用的话this指针指向bar,构造函数的话会指向obj实例
		*/
		return that.apply(this instanceof fBound ? this : context, arg.concat(secoundArg))
	}
	// 修改返回函数的 prototype 为绑定函数的 prototype,实例就可以继承绑定函数的原型中的值
	fBound.prototype = this.prototype
	return fBound
}


 var value = 2;

    var foo = {
      value: 1
    };
    
下面是call的输出:
var foo = {
	value : 1
}
    function bar(name, age) {
      this.habit = 'shopping';
      console.log(this.value);  // undefined   因为this指向了obj,因为new会让指针指向实例
      console.log(name);  // daisy
      console.log(age);  // 18
    }

    bar.prototype.friend = 'kevin';

    var bindFoo = bar.bind(foo, 'daisy');
    var obj = new bindFoo('18');
    // var obj = new bindFoo();
    console.log(obj.habit);  // shopping
    console.log(obj.friend); // kevin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值