javascript高級程序設計第三版 第五章 引用類型

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"
發佈了33 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章