JavaScript學習筆記——引用類型:Object類型、function類型

引用類型是一種數據結構,用於將數據和功能組織在一起。
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
發佈了41 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章