【重学JS】-8,call和apply

152 阅读2分钟

这是我参与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的情况:

  1. 以函数形式调用时,this指向是window
  2. 以方法形式调用时,this是调用方法的对象
  3. 以构造函数的形式调用时,this是指定的那个对象
  4. 使用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实参对象

在调用函数时,浏览器每次都会给我们传递两个隐含参数,

  1. 函数上下文的this
  2. 封装实参的对象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,'你好');