一、call和apply的区别
唯一的区别:传参的格式不一样
func.call(obj,1,2,3)
func.apply(obj,[1,2,3]) //apply只接收两个参数,第一个是要为func绑定的this值,第二个为数组
二、模拟实现apply
向函数的原型上添加了myApply方法,所有函数都可调用
Function.prototype.myApply = function (obj) {
let content = obj ? Object(obj) : window
// Object(obj) 将obj转换为对象,若obj是普通数据类型(如字符串、数字、布尔值),则返回相应的包装对象
content.func = this //往content对象上新增一个属性func,属性值为调用myApply的函数
let result;
if (arguments[1]) { // 判断是否传入了第二个参数
result = content.func(...arguments[1])
} else {
result = content.func()
}
delete content.func
return result;
}
三、arguments和args
arguments是函数内部的一个特殊对象,它包含了所有传递给函数的参数,它不是一个真正的数组,而是一个类数组对象
args是在函数参数列表中定义的形式参数的名称。这只是一个命名约定,你可以将其替换为其他的名称,比如 …args 表示使用剩余参数语法,将所有的实参收集到一个名为 args 的数组中。这样的写法通常用于在函数内部处理不定数量的参数