Đối tượng Function ECMAScript (class)
- Trang trước Đối tượng arguments
- Trang tiếp theo Bí ẩn (closure)
Hàm trong ECMAScript thực sự là đối tượng có chức năng đầy đủ.
Đối tượng (lớp) Function
Điều đáng chú ý nhất trong ECMAScript có lẽ là hàm thực sự là đối tượng có chức năng đầy đủ.
Lớp Function có thể biểu thị bất kỳ hàm nào được định nghĩa bởi nhà phát triển.
语法 để tạo hàm trực tiếp bằng lớp Function như sau:
var function_name = new function(arg1, arg2, ... , argN, function_body)
Trong hình thức trên, mỗi arg cả hai đều là một tham số, tham số cuối cùng là thân hàm (mã cần thực hiện). Các tham số này phải là chuỗi.
Nhớ lại hàm này không?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
còn có thể định nghĩa nó như sau:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
Mặc dù do sự liên quan đến chuỗi, hình thức này có thể khó viết hơn, nhưng nó giúp hiểu rằng hàm chỉ là một loại tham chiếu, chúng có hành vi giống như hàm được tạo ra bằng Function 类.
Vui lòng xem ví dụ sau này:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //đưa ra "20"
Như bạn đã biết, hàm thứ hai đã tải lại hàm đầu tiên, làm cho doAdd(10) đưa ra "20" thay vì "30".
Nếu viết lại đoạn mã theo hình thức sau, khái niệm này sẽ rõ ràng hơn:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Vui lòng quan sát đoạn mã này, rõ ràng là giá trị của doAdd đã thay đổi thành con trỏ trỏ đến đối tượng khác. Tên hàm chỉ là tham chiếu đến đối tượng hàm, hành vi như các đối tượng khác. thậm chí có thể làm hai biến trỏ đến cùng một hàm:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //đưa ra "20" alsodoAdd(10); //đưa ra "20"
Ở đây, biến doAdd được định nghĩa là hàm, sau đó alsodoAdd được khai báo là con trỏ trỏ đến cùng hàm. Cả hai biến này đều có thể thực hiện mã của hàm và đưa ra kết quả tương tự - "20". Do đó, nếu tên hàm chỉ là tham chiếu đến biến hàm, vậy có thể truyền hàm làm tham số cho hàm khác không? Câu trả lời là có thể!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //xuất ra "20"
Trong ví dụ trên, callAnotherFunc() có hai tham số - hàm cần gọi và các tham số được truyền sang hàm. Mã này truyền hàm doAdd() sang hàm callAnotherFunc(), tham số là 10, xuất ra "20".
Lưu ý:Mặc dù có thể sử dụng hàm constructor Function để tạo hàm, nhưng không nên sử dụng nó vì việc định nghĩa hàm bằng cách này chậm hơn rất nhiều so với cách truyền thống. Tuy nhiên, tất cả các hàm đều nên được coi là đối tượng của lớp Function.
Thuộc tính length của đối tượng Function
Như đã nói, hàm thuộc loại tham chiếu, vì vậy chúng cũng có thuộc tính và phương thức.
Thuộc tính length được định nghĩa bởi ECMAScript đã chỉ ra số lượng tham số mong đợi của hàm. Ví dụ:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //xuất ra "1" alert(sayHi.length); //xuất ra "0"
Hàm doAdd() định nghĩa một tham số, vì vậy length của nó là 1; hàm sayHi() không định nghĩa tham số, vì vậy length là 0.
Lưu ý, bất kể đã định nghĩa bao nhiêu tham số, ECMAScript có thể chấp nhận bất kỳ số lượng tham số nào (tối đa 25 tham số), điều này đã được giải thích trong chương "Tóm tắt về hàm". Thuộc tính length chỉ cung cấp một cách简便 để xem số lượng tham số mong đợi trong trường hợp mặc định.
Phương thức của đối tượng Function
Đối tượng Function cũng có các phương thức valueOf() và toString() mà tất cả các đối tượng chia sẻ. Cả hai phương thức này đều trả về mã nguồn của hàm, rất hữu ích trong việc gỡ lỗi. Ví dụ:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Mã trên đã xuất ra văn bản của hàm doAdd().Thử ngay!
- Trang trước Đối tượng arguments
- Trang tiếp theo Bí ẩn (closure)