一、call()、apply()
—这两个方法都是函数对象的方法,需要通过函数对象来调用
—当对函数调用call()和apply()方法时,都会调用函数执行
—在调用call和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行的this
—call()方法可以将实参在对象之后一次传递,apply()方法需要将实参封装到一个数组中统一传递
二、this的情况
1.以函数形式调用时,this永远是window
2.以方法的形式调用时,this是调用方法的对象
3.以构造函数的形式调用时,this是新创建的那个对象
4.使用call和apply调用时,this是指定的那个对象
代码演示
<script>
function fun(a,b){
console.log("a="+a);
console.log("b="+b)
alert(this.name)
}
var obj={
name:"obj",
sayName:function(){
alert(this.name);
}
}
var obj2={
name:"obj2",
}
//obj.sayName();//obj
//obj.sayName.call(obj2);
//fun.call(obj,2,3);
fun.apply(obj2,[2,3]);
// fun();
</script>
三、arguments
在调用函数时,浏览器每次都会传递两个隐含的参数:
1:函数的上下文对象 this
2:封装实参的对象 arguments
-arguments 是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度
-在调用函数时,我们所传递的实参都会在arguments中保存
-arguments.length可以获取实参的长度
-我们即使不定义形参,也可以通过grguments来使用实参,只不过比较麻烦
arguments[0]表示第一个实参
arguments[1]表示第二个实参
-arguments有个属性叫callee,
这个属性对应一个函数对象,就是当前正在指向函数的对象
代码演示
</script>
function fun(){
//这两种都是检查arguments是不是数组
console.log(arguments instanceof Array);
//console.log(Array.isArray(arguments));
//console.log(arguments.length);//用来获取实参的长度
// console.log(arguments[0]);//hello
console.log(arguments.callee);
}
fun("hello",true);
</script>