本文共 1802 字,大约阅读时间需要 6 分钟。
apply.call.bind 的作用:都是为了改变函数运行时上下文(this指向)。
函数定义:call是可以被所有方法调用的,所以需要定义在 Function的原型上。
函数接收参数:绑定函数被调用时只传入第二个参数及之后的参数。Function.prototype.defineCall = function (context) { context = context || window; //第一个参数为undefined或null的时候,那么会转变为window context.fn = this; //给context添加一个方法,指向this let args = []; args = [...arguments].slice(1); //首先通过[...xxx]把arguments类数组变成数组,再拿到去除第一个参数的新数组 let result = context.fn(...args); delete context.fn; //删除该方法,不然会对传入对象造成污染 return result;}
测试结果:
let sayName = function (age) { console.log('current name: ' + this.name, "current age: " + age);}let obj1 = { name: "obj's name"}sayName.defineCall(obj1, 22); //this指向 sayName函数实例// current name: obj's name current age: 22
思路和call是一样的只是传参不同方式而已
// 模拟 apply 方法Function.prototype.defineApply = function (context, arr) { context = context || window; context.fn = this; let args = [...arguments][1]; let result = args ? context.fn(args) : context.fn(); delete context.fn; return result;}
测试结果:
let obj2 = { name: ['Tom', 'Johy', 'Joe', 'David']}sayName.defineApply(obj2, [3, 4, 5, 6, 7]);// current name: Tom,Johy,Joe,David current age: 3,4,5,6,7
bind() 方法会创建一个新函数。
//用call、apply模拟实现bindFunction.prototype.bind = function (context) { let self = this; // 保存函数的引用 return function () { // 返回一个新的函数 // console.log(arguments); // return self.apply(context, arguments); return self.call(context, arguments); }};
测试结果:
let obj = { name: 'seven'}let func = function () { console.log(this.name) //seven}.bind(obj);func('zhangsan', 20);
转载地址:http://fiuvi.baihongyu.com/