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"