一.什么是arguments?
Function.arguments
arguments是函数的一个属性,储存传入函数的实参,它是一个类数组对象(俗称伪数组)。
注意:如果函数不在执行期间,那么该函数的
arguments
属性的值是
null
。
这里简单陈述一下,伪数组和数组的关系,伪数组除了有length属性,其他数组API均不可用。
所以如果要使用数组API,必须转换成真数组:
** Array.from(arguments) **es6中的数组新增方法
二.arguments的两种作用
** 作用一:**
** 储存函数的所有传递的实参**
** 作用二:**
** 在浏览器非严格模式下,会与形参产生隐射关系。**
** 当形参值发生变化,arguments中储存的对应实参也会发生变化。**
三.使用场景
1.new的功能封装实现,call和apply和bind源码实现。
具体代码可见我的上一篇
【js高级篇】手写call apply bind源码 超级详细_悠悠-wzr的博客-CSDN博客
function Fn(name, age) {
this.name = name;
this.age = age
}
function CreateObj(callback) {
//让callback的this指向new创建的对象
var arg = Array.from(arguments).slice(1);
//将这个对象的隐式原型(__proto__)指向callback. prototype
var obj = Object.create(callback.prototype);
callback.apply(obj, arg);
//返回这个对象
return obj
}
//实现new
var newObject = CreateObj(Fn, "xyy", "18");
console.log(newObject)
console.log(newObject.__proto__.constructor)
2.柯里化函数封装实现
// 柯里化:是将一个多参函数,转换成可以每次只传递一个参数的函数、当然也可以传递多参,并且返回一个新的函数接收剩余参数
//封装过程,将多惨函数作为柯里化函数的回调函数
//将返回一个新的函数接收剩余参数,这个新的函数可以接收多个或一个参数
// 柯里化的意义在于高内聚,低耦合
// curry(add)()(1);
function curry(callback) {
//返回新的数组,并把之前的参数保存
return function father() {
if (arguments.length < callback.length) {
//保留当前传递的参数
var param = Array.from(arguments)
return function f2() {
return father(...(param.concat(Array.from(arguments))))
}
} else if (arguments.length == callback.length) {
return callback.apply(this, arguments)
}
}
}
版权归原作者 悠悠-wzr 所有, 如有侵权,请联系我们删除。