ECMAScript學習筆記(五)
Function型別
在ECMAScript中,每個函式都是一個函式物件,都是Function型別的例項,且都和其他引用型別一樣具有屬性和方法。
函式名實際上是一個指向函式物件的指標,不會和某個函式繫結。
function sum(num1, num2) { return num1 + num2; } // 相當於: var sum = function(num1, num2) { return num1 + num2; }; var sum = new Function("num1", "num2", "return num1 + num2");
以上程式碼意味著,一個函式可能會有多個名字:
function sum(num1, num2) { return num1 + num2; } var anothorSum = sum; // 將一個anothorSum變數的值設定為sum的值。使得他們指向了同一個函式。
沒有過載
ECMAScript函式是沒有過載的。
function addSomeNumber(num) { return num + 100; } function addSomeNumber(num) { return num + 200; } // 相當於 var addSomeNumber = function(num) { return num + 100; } var addSomeNumber = function(num) { return num + 200; }
以上程式碼將addSomeNumber變數賦值為先後兩個函式物件。後一個函式物件覆蓋了前一個函式物件嗯。
函式的宣告&函式表示式
對於函式宣告,解析器會先讀取宣告,並使其在執行任何程式碼之前可用。而對於函式表示式,則必須等到解析器執行到他所在的程式碼行才會被解釋。
作為值的函式
ECMAScript中的函式名本身就是一個變數,所以所有的函式都可以被當做值來使用。所以可以把一個函式傳遞給另一個函式,並且可以將一個函式作為另一個函式的結果返回。
function callSomeFunction(someFunction, someArgument) { return someFunction(someArgument); } function add10(num) { return num + 10; } var result1 = callSomeFunction(add10, 10); alert(result1); // 20
function createComparsionFunction(propertyName) { return function(object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }; }
函式內部屬性
arguments和this
arguments的作用是用於儲存函式引數。而這個物件還有一個叫callee的屬性,用於指向擁有這個arguments物件的函式。
對於一個遞迴函式:
function factorial(num) { if (num <= 1) { return 1; }else { return num * factorial(num - 1); } }
如果factorial函式被賦給另一個變數,而factorial變數被賦值為null的話……那麼上述程式碼就掛了。
所以有了callee物件,就衍生了下面這樣的用法:
function factorial(num) { if (num <= 1) { return 1; }else { return num * arguments.callee(num - 1); } }
這樣函式名和函式體就解耦了。
另一個物件this 其行為跟Java中的this類似。this引用的是函式賴以執行的環境物件。
eg: 在網頁的全域性作用域中呼叫函式時,則this引用的是window。
window.color = "red"; var o = {color: "blue"}; function sayColor() { alert(this.color); } o.sayColor = sayColor; o.sayColor(); // blue
ECMAScript 5規範了另一個函式物件的屬性:caller。這個屬性儲存了呼叫當前函式的函式的引用。若在全域性作用域中呼叫當前函式,則該值為null
函式屬性和方法
每個函式都包含:length和prototype兩個屬性。
length:表示函式希望接收的明明引數的個數
prototype:包含了引用型別的所有例項方法
每個函式包含了:apply()和call()兩個方法。這兩個方法的用途都是在特定的作用域中呼叫函式。
apply():接收兩個引數:執行函式的作用域,引數陣列。
call():接收兩個引數:執行函式的作用域,傳入其餘引數。
這兩個方法能夠擴充函式賴以執行的作用域。
eg:
window.color = "red"; var o = {color: "blue"}; function sayColor() { alert(this.color); } sayColor(); // red sayColor.call(this); // red sayColor.call(window); // red sayColor.call(o); // blue
基本包裝型別
ECMAScript提供了三個特殊的引用型別:Boolean、Number、String.
每當讀取一個基本型別值的時候,後臺就會建立一個對應基本包裝型別的物件。
引用型別和基本包裝型別的區別在於物件的生存期:使用new操作符建立的引用型別的例項,在執行流離開當前作用域前都會一直被存在記憶體中。而自動建立的基本包裝型別的物件,只存在於一行程式碼的執行瞬間之後會立即被銷燬。
那麼,就不能在執行時為基本型別值新增屬性和方法了。
各種基本型別的用法之類的跟Java裡面差不多,我就不記錄了。嗯。
單體內建物件
內建物件就是:ECMAScript實現提供的不依賴於宿主環境的物件。
Global物件
Global不屬於其他任何物件的屬性或者方法,最終都是他的屬性和方法。
1.URI編碼方法:
encodeURI()和encodeURIComponent()方法可以對URI進行編碼。
2.eval()方法
eval()方法相當於一個完整的ECMAScript解析器。能夠接受一個要執行的ECMAScript程式碼的字串。
然後就執行了。
4.window物件
Math物件
跟Java裡的差不多,就懶得記了。