call()和apply()方法
/**
* 以下三种形式都可以调用fun函数
* 区别:
* 在调用call()和apply()时,可以将一个对象指定为第一个参数
* 在javascript严格模式中,在调用函数时,第一个值均成为this值,
* 在JavaScript非严格模式中,如果第一个参数值是null或undefined,他会使用全局变量代替
* 因此,这两个方法可以用来修改this值
*/
function fun() {
console.log(this.name);
}
var obj1 = {name:"顺悟空"};
var obj2 = {name:"猪八戒"};
fun();// <empty string> this为window
fun.call(obj1);//猪八戒
fun.apply(obj2);//孙悟空
/**
* call()方法可以将实参在对象之后传递
* 而apply()方法需要将实参统一封装在数组中传递
*
*/
function con(a,b) {
console.log("a="+a);
console.log("b="+b);
}
con();// a=undefined b=undefined
con.call(obj1,3,5);//a=3,b=5
con.apply(obj1,[1,3]);//a=1,b=3
// "use strict";//使用严格模式
/**
* 以下三种形式都可以调用fun函数
* 区别:
* 在调用call()和apply()时,可以将一个对象指定为第一个参数
* 在javascript严格模式中,在调用函数时,第一个值均成为this值,
* 在JavaScript非严格模式中,如果第一个参数值是null或undefined,他会使用全局变量代替
* 因此,这两个方法可以用来修改this值
*/
function fun() {
console.log(this.name);
}
var obj1 = {
name: "顺悟空",
sayname: function () {
alert(this.name)
}
};
var obj2 = {name: "猪八戒"};
obj1.sayname();//顺悟空
obj1.sayname.apply(obj2);//猪八戒
arguments用法
<script type="text/javascript">
/**
* 在调用函数时,浏览器每次都会传递两个隐含参数
* 1.函数上下文的this
* 2.封装实参的对象arguments
* -arguments是一个类(类似但不是)数组对象,也可以通过索引操作数据,也可以获取长度
* 在调用函数时,我们所传递的实参都会封装在arguments中
* arguments.length可以用来获取实参长度
* 即使不定义形参 也可以通过arguments来使用实参,只不过比较麻烦
* 它还有一个属性叫callee
* 这个属性对应一个函数对象,就是当前执行的函数对象
*/
function fun() {
console.log(arguments instanceof Array);//判断是否是数组 false
console.log(Array.isArray(arguments));//判断是否是数组false
console.log(arguments.length);//2,实参数的数量
console.log(arguments[1]);//true
console.log(arguments.callee==fun);//ture
}
fun("hellow",true);