003JS进阶之bind

本文介绍了JavaScript中bind方法的使用,包括其功能、默认行为以及如何在函数内部改变this指向。还展示了如何手写bind的实现,区分普通函数和构造函数的使用场景。
摘要由CSDN通过智能技术生成

bind

bind使用

function ff() {
	console.log(this, arguments)
	return '';
}

// 默认调用
ff(1,2,3)  // this: windows  arguments: [1,2,3]

// bind
// 方法不会执行
var bindFF = ff.bind({n: 'n'}, 'a', 'b');
// 调用时才会执行
bindFF('c', 'd');  // // this: {n: 'n'}  arguments: ['a', 'b', 'c', 'd']

// bind使用
setTimeOut(window.addEventListener.bind(window, 'resize', ff), 0)
// 等同于
var bindFF = window.addEventListener.bind(window, 'resize', ff) 
// bindFF  => window.addEventListener('resize', ff)
setTimeOut(bindFF, 0)

手写bind实现

Function.prototype.mybind = function(asThis) {
	// 缓存参数
	var slice = Array.prototype.slice;
	// bind方法获取的参数
	var args = slice.call(arguments, 1);
	
	var fn = this;
	
	// this指向判断
	if(typeof fn !== 'function') {
		throw new Error('调用方法this必须是一个函数')
	}
	
	// 返回一个方法:执行之前的方法
	// 拼接后续参数
	function inner() {
		// 判断当前函数是否是new
		var isNew = this.constructor === inner;
	
		var innerArgs = slice.call(arguments);
    	// 数组拼接
    	args = args.concat(innerArgs);
    	
    	// new出来传函数this 不是传之前参数
    	return fn.apply(isNew ? this : asThis, args);
	}
	return inner;
}

function ff() {}

// 1、函数使用
var newFF = ff.mybind({name: 'zhangsan'}, 'x', 'y', 'z');
newFF('x1', 'y1');

// 2、构造函数使用
var newFF2 = ff.mybind({name: 'zhangsan'}, 'x', 'y', 'z');
var instance = new newFF2('z1', 'z2');  //  this.constructor 指向 newFF2 => inner
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值