在调用函数时,浏览器每次会传递两个隐含参数:
1.函数的上下文对象this
2.封装实参的对象arguments
this:
浏览器向函数内部传递一个隐含参数this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数调用的方式不同,this会指向不同的对象。
- 以函数的形式调用时,this永远都是window
- 以方法的形式调用时,this就是调用方法的那个对象
- 当以构造函数的形式调用时,this就是新创建的那个对象
当函数对象调用call()或apply()方法时,可以将一个对象指定为第一个参数,此时这个对象会成为函数执行时的this。(使用call()或apply()调用时,this是指定的那个对象。)
//以函数形式调用,this为window
function fun(){
console.log(this);
}
var obj = fun();
//以方法调用,this指的是拥有这个方法的对象
var obj = {
name:"孙悟空",
age:18,
gender:"男",
sayHello:function(){
console.log(this);
console.log("我是"+this.name);
}
};
obj.sayHello();
//通过this给obj1添加属性
function Person(name, age){
this.name=name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
return 1;
}
};
var obj1 = new Person("猪八戒",16);
console.log(obj1);
console.log(obj1.name);
console.log(obj1.sayHello());
console.log(obj1.sayHello);
var a = {
name:"沙和尚",
}
<!-----当函数对象调用call()或apply()方法时,可以将一个对象指定为第一个参数,此时这个对象会成为函数执行时的this----->
function fun() {
console.log(this);
}
fun(); //window
fun.call(a); //Object{name:"沙和尚"}
第二种情况结果为:
第三种情况结果:
arguments:
arguments只能在函数内部使用,表示传给该函数的所有实参的集合,当无法获确认参个数,有需要传递实参时,可以用索引来获取实参的值。它是一个类数组对象,因为typeof(arguments)的值为object。arguments还有一个属性callee,这个属性对应当前正在指向的函数对象。
function fun(){
console.log(typeof(arguments));
console.log(arguments.callee);
}
var obj = fun();
显示结果为
直接创建对象时属性名与属性值之间为冒号,每条属性后为逗号
通过构造函数创建对象时属性名和属性值之间为等于号,每条属性后为分号