<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>
</title>
<style>
</style>
<script type="text/javascript">
/* function fun(){
alert("我是fun函数!");
}
*/
/*call()和apply()
这两个方法都是函数对象的方法,需要通过函数对象来调用
当会函数调用call()和apply()都会调用函数执行
在调用call()和appply()可以将一个对象指定为第一个参数
此时这个对象将会成为函数执行时的this
*/
// fun(); //弹出"我是fun函数"
// fun.apply(); //弹出"我是fun函数"
// fun.call(); //弹出"我是fun函数"
//在调用call()和apply()可以将一个对象指定为第一个参数
// var obj={};
// fun.call(obj); //弹出"我是fun函数"
/* function fun1(){
alert(this);
}
//以函数形式调用this是window
fun1(); //[object window]
//apply() call()传递的对象是谁,this就是谁
fun1.call(obj) //[object Object]
fun1.aooly(obj); //[object Object]
*/
/* function fun(){
alert(this.name);
}
var obj={name:"sunwukong"};
var obj2={name:"zhubajie"};
fun.apply(obj); //sunwukong
fun.call(obj); //sunwukong
fun.apply(obj2); //zhubajie
fun.call(obj2); //zhubajie */
/*fun()和call() apply()的区别
fun() 的this只能是window
fun.call() fun.apply()可以指定this是什么*/
/*用apply()可以指定函数执行时的参数*/
/* var obj={
name:"obj", //是逗号,不是分号
sayName:function(){
alert(this.name);
}
}
obj.sayName(); //obj
obj.sayName.apply(obj3);
*/
/*call()方法可以将实参在对象之后依次传递
apply()方法需要将实参封装到一个数组中统一传递*/
function fun(a,b){
console.log("a="+a);
console.log("b="+b);
}
var obj={};
fun.call(obj);
//a is undefined
//b is undefined
fun.call(obj,2,3);//a=2 b=3
fun.apply(obj,[3,4]); //a=3 b=4
/*this的情况:
1.以函数形式调用时,this永远是window
2.以方法的形式调用时,this是调用方法的对象
3.以构造函数调用时,this是新创建的那个对象
4.使用apply()和call()调用时,this是指定的那个对象
* */
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>
</title>
<style>
</style>
<script type="text/javascript">
/*在调用函数的时候,浏览器每次都会传递进两个隐含的参数
1.函数的上下文对象this
2.封装参数的对象arguments
arguments是一个类数组对象,不是数组
它也可以通过索引来操作数组,也可以获取长度
在调用函数时,我们所传递的参数都会在arguments中保存
也可以通过arguments[下标]的方式读取,下标从0开始
arguments.length可以用来获取实参的长度
即使不定义形参,也可以通过arguments来使用实参
只不过比较麻烦
arguments[0] 表示第一个实参
arguments[1] 表示第二个实参
不管是否定义形参,实参还是会在arguments中保存
* */
function fun(a,b){
// console.log(arguments); //[object Arguments]
// console.log(arguments instanceof Array); //false
// console.log(Array.isArray(arguments)); //false
// console.log(arguments.length); //2
// console.log(arguments[0]); //hello
// console.log(arguments.callee);
/*arguments中有一个属性callee,arguments.callee
* 它所对应一个函数对象,就是当前正在指向的函数对象*/
/*? fun(a,b){
// console.log(arguments); //[object Arguments]
// console.log(arguments instanceof Array); //false
// consol*/
console.log(arguments.callee==fun) //true
}
// fun();
fun("hello","nihao");
</script>
</head>
<body>
</body>
</html>