这是我参与2022首次更文挑战的第4天,活动详情查看:链接
一,函数对象的方法
1,call()和apply()
call()和apply()这两个方法都是函数对象的方法,需要通过函数对象来调用
当对函数调用call()和apply(),函数都会执行。
下面代码中,三种方法都会执行函数,但是区别的是:
- 在调用call()和apply()的时候,可以将一个对象指定为第一个参数,如:2
此时这个对象将会成为函数执行时的this
- call()方法可以将实参在对象之后依次传递,如:3
- apply()方法需要将实参封装到一个数组中统一传递,如:4
function fun(){
alert('我是函数方法',this)
}
fun.call()
fun.apply()
fun()
#此时以上执行函数,函数都归window所有 [Object,Windown]
# 2.call()和apply()
var obj = {}
fun.call(obj)
fun.apply(obj)
#此时打印的话,此时fun的this 归obj所有,[Object,Object]
var person = {
name:'孙尚香',
sayName:function(){
alert(this.name)
}
}
var person2 = {
name:'刘备',
}
person.sayName() //孙尚香
person.sayName.apply(person2) // 刘备
#3.call()传递参数
function callFun(a,b){
console.log('a='+a)
console.log('b='+b)
alert(this.name)
}
var call_obj ={
name:'我是call'
}
callFun.call(call_obj,2,3)
//打印 a=2;b=3
#4 apply()传递参数
function applyFun(a,b){
console.log('a='+a)
console.log('b='+b)
alert(this.name)
}
var apply_obj ={
name:'我是apply'
}
applyFun.call(call_obj,[2,3])
//打印 a=2;b=3
通过上面示例,我们总结出:
#this的情况:
- 以函数形式调用时,this指向是window
- 以方法形式调用时,this是调用方法的对象
- 以构造函数的形式调用时,this是指定的那个对象
- 使用call和apply调用时,this是指定的对象。
#call()和apply()的区别
相同:都是改变this指向
不同:传参方式不同
2,bind()
方法也改变this指向,但会返回一个新的函数,需要再次调用
//this 永远指向最后调用它的那个对象
var obj1={
name:"小明",
sayName:function() {
console.log(this.name);
}
}
var obj2={
name:"小红",
sayName:function() {
console.log(this.name);
}
}
var fun3 = obj1.sayName.bind(obj2); //obj1的this指向改变为obj2
fun3();
二,arguments实参对象
在调用函数时,浏览器每次都会给我们传递两个隐含参数,
- 函数上下文的this
- 封装实参的对象arguments
-arguments 是一个类数组对象,他可以通过索引操作数据,也可以获取长度
-在调用函数时,我们所传递的实参都会在arguments中保存
-arguments.length 可以用来获取实参的长度
-arguments[0] 表示第一个实参 [1] 表示第二个,依次类推
-arguments中有一个属性叫callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fun(){
console.log(arguments)
console.log(arguments instanceof Array) //false
console.log(Array.isArray(arguments)) //false
console.log(arguments.length) //3
//获取arguments某个值
console.log(arguments[1]) // 1
console.log(arguments.callee) //当前函数 arguments.callee == fun ?? true
}
fun('hello',1,'你好');