2010年10月9日 星期六

JavaScript上的同名函數陷阱!!

Function Overload在java、delphi等程式語言上可說是不會特別留意卻又好用無比的一項功能,沒有想到在JavaScript中卻沒有提供。由於 JavaScript屬於「鬆散型態的程式語言(Loosely typed languages)」,變數的資料型態是在指定資料時決定,例如:

x = 10;         // 表示整數值資料型態。
x = "小爪哇";   // 接著再指定字串,馬上轉成字串資料型態。

因為這個特性,所以無法對應資料型態作Overload還可以理解,但沒有料想到連傳入參數的個數差異也無法Overload,實在是始料未及。

這幾天應公司要求支援,因此被調去使用JavaScript協助撰寫一些Web程式的功能;已經好久沒有使用JavaScript寫程式,以前只用來寫一些DHTML的花俏功能讓自己看起來很興奮,就沒有再更進一步去了解JavaScript的特性。還好這次只是協助撰寫資料檢查的功能函數,應該不會用到太深度的語法,理論上來說應該不會碰上啥問題才對。

由於JavaScript跟C語言的語法雷同,所以就左貼貼、右改改,很快速的就完成一些函數,開始測試~!?怎麼執行結果怪怪的?反回去查才發現,怎麼某個函數功能一直沒有被執行?上網查了一下才發現,哇勒!!JavaScript不能使用同名異構函數!!...orz

舉例來說,底下的二個同名函數:

function  MyAlert(First) { alert("One Argument"); }
function  MyAlert(First, Second) { alert("Two Arguments"); }

MyAlert("Argument");    // Two Arguments

在原先的認知下,應該是要顯示"One Argument",但是上述例子的執行結果居然是"Two Arguments",最後一次定義的函數發生作用。還好開始進行沒多久就發現這個不應該犯的錯,不然回頭不知得花多少時間來調整這些函數。

在網路上翻閱的幾篇文章中,關於參數個數的說明可以參考「The arguments array- the secret to robust functions」, 作者對於參數個數的用法提出頗詳細的說明與範例。文中提到,由於JavaScript函數的參數傳遞採用陣列方式(arguments array),因此傳入參數的個數可用arguments.length取得。所以作者在文章中特別舉出robust function範例,特意不在定義中加入參數,而在函數中使用物件arguments的length屬性來取得參數個數。

看來還要再花點心思了解JavaScript的語法,萬一再帶入一些JavaScript語言不支援的作法‧‧‧只怕又得加班餵「臭蟲」了!!

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...