5 引用类型
5.1 Object类型
//第一种创建方式 new后加构造函数
var person=new Object();
person.name="xxx";
//第二种 对象字面量
var person={
name:"x"
};
//访问方式
person.name
person["name"]
5.5 Function类型
每个函数都是Function类型的实例,与其他引用类型一样具有属性和方法。函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。
没有重载
5.5.2 函数声明与函数表达式
//函数声明
alert(sum(10,10)); //可运行
function sum(num1,num2){
..
}
//函数表达式
alert(sum(10,10)); //报错
var sum = function (num1,num2){
..
}
5.5.4 函数内部属性
函数内部的两个特殊对象:arguments和this。
arguments主要用途是保存函数参数,但还有一个叫callee的属性,指向拥有这个arguments对象的函数。
function factorial(num){
if(num<1){
return 1;
}else{
//return num*factorial(num-1);
return num*arguments.callee(num-1);//相同效果且可以解耦,不必依赖函数名
}
}
this引用的是函数执行的环境对象,运行时决定this的值。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//red
o.sayColor=sayColor;
o.sayColor();//blue
函数对象的属性:caller
function outer(){
inner();
}
function inner(){
//alert(inner.caller);
//相同效果,但严格模式下不可用
alert(arguments.callee.caller);
}
outer();//弹出outer()
5.5.5 函数属性和方法
函数包含两个属性:length和prototype
length:函数希望接收的命名参数的个数
prototype:保存它们所有实例方法的真正所在,非常重要
函数包含两个非继承而来的方法:apply()和call(),用途是在特定作用域中调用函数,实际上等于设置函数体内this的值。
apply()接收两个参数,1是运行函数的作用域,2是参数数组,可以是Array实例或arguments对象
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10));//callSum1在全局作用域中调用,因此在执行sum函数时传入this作为this值,即传入的就是window对象
alert(callSum2(10,10));
function callSum(num1,num2){
return sum.call(this,num1,num2);
}
call()方法与apply()方法作用相同,区别在于接收参数方式不同。第一个仍然是this值,其余参数都必须逐个列举出来直接传递给函数
call和apply的真正用途是,扩大函数赖以运行的作用域。好处是对象不需要与方法有任何耦合关系。
bind(),这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor=sayColor.bind(o);
objectSayColor();//"blue"