上一篇博客写到防抖和节流的简单分析和操作,在经典代码中有一些自己之前没有涉及过的知识点,此篇博客特来补充学习一下。
一、arguments
一、简介
了解arguments这个对象之前先来认识一下javascript的一些功能:
**其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。**Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
我们来声明一个函数,并打印它的arguments
(function (a){
console.log(arguments)
console.log(a)
})(1)
控制台打印如下:
这里再补充一个知识,立即执行函数
立即执行函数的两个形式:
(function() {
}) ()
(function () {
} ())
常见函数都是声明函数名之后再通过函数名调用,而立即执行函数声明后可立即调用,使用形式如上。
二、apply
提到apply,这里就需要再说一下与之相近的 call 和 bind。
先来看两个例子
var name='蔡徐坤',hobby='唱跳'
var obj={
name: '菜虚鲲',
hobby:this.hobby,
myfun:function(){
console.log(this.name + '爱好' + this.hobby )
}
}
console.log(obj.hobby) //唱跳
obj.myfun() // 菜虚鲲爱好唱跳
这里的this指向的是obj
var hobby='打篮球'
function yourHobby(){
console.log(this.hobby)
}
yourHobby() // 打篮球
这里的this指向的是window
call、apply、和bind 都可以改变this指向
来看例子
var hobbyObj = {
name: '蔡徐坤',
hobby: '打篮球'
}
obj.myfun.call(hobbyObj) //蔡徐坤爱好打篮球
obj.myfun.apply(hobbyObj) //蔡徐坤爱好打篮球
obj.myfun.bind(hobbyObj)() //蔡徐坤爱好打篮球
现在的this指向了hobbyObj,bind与call 和apply的区别在于多了一个(),其他都是一致的。
再来看一下他们的传参形式
var name='蔡徐坤',hobby='唱跳'
var obj={
name: '菜虚鲲',
hobby:this.hobby,
myfun:function(hobby2,hobby3){
console.log(this.name + '爱好' + this.hobby + '、'+hobby2 + '和'+ hobby3 )
}
}
var hobbyObj = {
name: '蔡徐坤',
hobby: '打篮球',
}
obj.myfun.call(hobbyObj, '唱跳','rap') //蔡徐坤爱好打篮球、唱跳和rap
obj.myfun.apply(hobbyObj,['唱跳','rap']) //蔡徐坤爱好打篮球、唱跳和rap
obj.myfun.bind(hobbyObj,'唱跳','rap')() //蔡徐坤爱好打篮球、唱跳和rap
obj.myfun.bind(hobbyObj,['唱跳','rap'])() //蔡徐坤爱好打篮球、唱跳,rap和undefined
由此可以看出,call和bind传参都是参数列表,而apply传参是以数组的形式传参,bind返回的是函数,其他与call 和apply相同。