標籤:
函數的屬性和方法
JS中的函數是對象,因此函數也有屬性和方法。
每個函數都包含兩個屬性:length和prototype。
length屬性,表示函數希望接收的具名引數的個數。
prototype屬性,是儲存它們所有執行個體方法的真正所在。
在ECMAScript5中,prototype屬性是不可枚舉的。
每個函數都擁有兩個非繼承而來的方法:apply()和call()。
這兩個方法的用途都是在特定的範圍中調用函數;實際上等於設定函數體內this對象的值。
apply()方法接收兩個參數:一個是在其中運行函數的範圍;另一個是參數數組(可以是Array執行個體,也可以是arguments對象)。
call()方法接收兩個參數:一個是在其中運行函數的範圍;另一個是傳遞給函數的參數(必須逐一列舉)。
apply()方法與call()方法的區別僅僅在於接收參數的方式不同。
apply()和call()真正強大的地方在於能夠擴充函數賴以啟動並執行範圍。
1 window.color = "red"; 2 var o = { 3 color : "green" 4 }; 5 function sayColor() { 6 console.log(this.color); 7 }; 8 sayColor(); //"red" 9 sayColor.call(this); //"red"10 sayColor.call(window); //"red"11 sayColor.call(o); //"green"
使用apply()和call()來擴充範圍的最大好處,就是對象不需要與方法有任何耦合關係。
兩個方法都允許顯式地指定調用所需的this值,也就是說,任何函數都可以作為任何對象的方法來調用,哪怕這個函數根本不是那個對象的方法。
ECMAScript5中還定義了一個方法:bind();這個方法會建立一個函數的執行個體,其this值會被綁定到傳給bind()函數的值。
例如:
1 window.color = "red";2 var o = {3 color : "green"4 };5 function sayColor() {6 console.log(this.color);7 };8 var x = sayColor.bind(o);9 x(); //"green"
JS apply()與call()