一个函数中为啥可以写这样的代码???
function f() {
let a = Array.prototype.shift.call(arguments);
console.log(a)
}
f('11','22')//11
能进来的哥们都知道这代码的作用是为了取实参的第一项!为啥就可以拿到呢,
一步步来:
1. arguments
其是一个类数组形式数据,打印出来发现其原型上少了数组的很多方法。也就是说空有其表,只有数组的样子,截图看下
这就造成了我们不能直接这样arguments.shift()
,他原型上面没有shift,当然就实现不了啊。
2. Array.protype
对js了解不够的朋友可能会懵。其实这就是数组的原型
,上面具有数组一切的方法。打印看看:
可以看到就是个数组的原型链。上面有shift
等方法
3. call
call。apply。bind都是改变this指向问题,来个简单的代码理解下
let obj={
getName:function () {
console.log(this.name);
}
}
let obj2={
name:'小明'
}
obj.getName()//undefined
obj.getName.call(obj2);//小明
总结:
所以Array.prototype.shift.call(arguments)
中,就是Array.prototype中有shift的方法,但是本身没有值啊,指向了arguments这个类数组对象上
,所以才能成功,arguments对象一直都没被改变,就是个this指向问题。
这中间的关系就是上面这句话,道理就是this指向变了,具体他怎么变的,怎么就能成功执行,绕了我很久。