引用類型是一種數據結構,用於將數據和功能組織在一起。
Object類型
創建Object實例的方式有兩種,一種是使用new操作符後跟Object構造函數。
var person = new Object();
person.name = "Nicholas";
person.age = 27;
另一種方式是使用對象字面量表示法。
var person = {
name:Nicholas;
age:27;
5:true;//數值屬性名會自動轉換爲字符串
};
一般來說,訪問對象屬性時使用的都是點表示法,在JavaScript也可以使用方括號表示法來訪問對象的屬性。
alert(person.name);
alert(person["name"]);
alert(person["name"+i]);
function類型
函數的定義:
funcation sum(num1,num2){
return num1+num2;
}//方法1
var sum = function(num1,num2){
return num1+ numm2;
};//方法2
函數是對象,函數名是指針
function sum(num1,num2){
return num1+ numm2;
}
alert(sum(10,10));
var anothersum = sum;
alert(anothersum(10,10));//20
sum = null;
alert(anothersum(10,10));//20
使用不帶圓括號的函數名是訪問函數指針,而非調用函數。此時,anothersum和sum同時指向同一個函數,因此anothersum可以被調用並返回結果。即使將sum設置爲null,讓他與函數斷絕關係,仍可以正常調用anothersum。
1、沒有重載
function addSomeNum(num){
return num + 10;}
function addSomeNum(num){
return num + 20;}//此函數被重寫,先前函數體被覆蓋
var result = addSomeNum(10);//30
2、函數聲明與函數表達式
解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用,至於函數表達式,則必須等到解析器執行到它所在的代碼行,纔會真正被執行。
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;}
代碼開始執行前已經讀取並將函數聲明添加到執行環境中,所以,即使聲明函數的代碼在調用它的代碼之後,也可以正常運行。如果把上述的函數聲明改爲函數表達式,就會在執行期間發生錯誤。
3、函數內部屬性
在函數內部,有兩個特殊的對象:arguements和this。
arguements的主要用途是保存函數參數,這個對象有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguements對象的函數。
var trueFactorial = factorial;
factorial = function(){
return 0;
};
alert(trueFactorial(5)); //120 遞歸運算
alert(factorial(5)); //0
另一個特殊對象是this。指向該function的擁有者,如果是全局函數this則指向window對象
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
o.sayColor = sayColor;
o.sayColor(); //blue
ECMAScript也規範化了另一個函數對象的屬性:caller。這個屬性中保存着調用當前函數的函數的引用,如果是在全局作用於中調用當前函數,它的值爲空。
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);//調用了outer.toString()
}
outer();//彈出outer的定義的源代碼
4、函數屬性和方法
外部屬性:
1、length:表示函數希望接受的參數的個數
2、prototype:保存着函數的例如valueOf()等函數,只是訪問方式是function.valueOf()而已,並且這個屬性裏的信息是不可以被枚舉的
apply()方法
接受兩個參數:一個是其中運行的作用於,裏一個數參數數組或者arguements對象。
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);//傳入arguments對象
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]);//傳入數組
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
call()方法
call方法與apply方法作用相同,區別僅在於接受參數的方式不同,第一個參數是this沒有變,變化的是其餘的參數都直接傳遞給函數。
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
apply和call方法的強大之處在於能夠擴充函數賴以運行的作用域。
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
//調用apply方法一樣
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
bind()方法
這個方法會創建一個函數的實例,其this值會被綁定到傳給bind函數的值。
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue