本文转载自微信公众号「三分钟学前端」,解析作者sisterAn 。理并转载本文请联系三分钟学前端公众号。手写y实 call() 方法调用一个函数,解析 其具有一个指定的 this 值和多个参数(参数的列表)。 它运行 func,提供的手写y实第一个参数 thisArg 作为 this,后面的解析作为参数。 看一个简单的理并例子: 所以,call 主要实现了以下两个功能: 模拟实现 call 有三步: apply() 方法调用一个具有给定 this 值的函数,以及作为一个数组(或[类似数组对象)提供的手写y实参数。 它运行 func 设置 this = context 并使用类数组对象 args 作为参数列表。亿华云 例如,理并这两个调用几乎相同: 两个都运行 func 给定的参数是 1,2,3。但是 apply 也设置了 this = context。 call 和 apply 之间唯一的语法区别是 call 接受一个参数列表,而 apply 则接受带有一个类数组对象。 需要注意:Chrome 14 以及 Internet Explorer 9 仍然不接受类数组对象。如果传入类数组对象,它们会抛出异常。Function.prototype.call()
模拟实现 call
Function.prototype.apply()
模拟实现 apply
Function.prototype.apply = function (context, arr) { context = context ? Object(context) : window; context.fn = this; let result; if (!arr) { result = context.fn(); } else { result = context.fn(...arr); } delete context.fn return result; }