作者TonyQ (^^)
看板Ajax
標題Re: [問題] 一個關於匿名函式與變數區域分類問題
時間Sat Jan 16 21:47:49 2010
※ 引述《Crow22312 (烏鴉)》之銘言:
: 有點難下標題的一個問題, 解釋起來可能會有點囉唆..
: 因為烏鴉在寫的小程式有許許多多的函式, 有些會跟另一支共用到,
: 但會需要有小部分修改. 在於量上面有一點點的規模, 所以希望函式們
: 能比較獨立的運作.
: 在每個函式傳入的參數上, 烏鴉習慣會讓他們檢查是否該有的都有,
: 已經讓他是在別人底下, 動態產生出來的函式了,
: 為什麼會抓不到上面一層的區域變數(參數)呢 0.0?
: 或者說是烏鴉想的太複雜了,
: 要做到檢查參數並丟log的類似功能有別的現成解決方法 ._.?
抱歉你原文的function scope 實在是太複雜,
外加你的 new Function (str,strFnBody) 我很少用有點暈頭轉向。
我是認為你的問題目前看起來應該是主要問題在於你的資料傳不進去,
而且我覺得這個函式每次都要再定義一次感覺就很浪費,
所以我直接放棄DEBUG 你原本的解法,請原諒我的懶惰。XD
(啊啊啊 不要急著 ← 我還沒講完啊啊啊 給我個機會~~~)
我先重新定義問題,現在有一個 function , 假設 param是 a,b,c
你希望檢查這個fn 有定義的 param 應該要非 undefined.
(在這裡我加上一條隱性規則,沒有定義任何 optional param 。)
(有定義的狀況就要自己key param name來規範了。)
就我的感覺是覺得應該可以透過 argumenets 來解決。
我的解法會是這樣
function checkFnParam(args){
var fnStr=args.callee.toString(); //取得function 定義字串
var fnNameCheck=fnStr.match(/^function\s([^\(]+)\(.+/);
//解析function name
fnName=(fnNameCheck==null) ? "anonymous" :fnNameCheck[1];
//如果functin name 是空白,就視為 anonymous function
var params=fnStr.substring(
fnStr.indexOf("(")+1,
fnStr.indexOf(")")).split(/[ ,]+/); //取得定義字串中的param
for(var i=0;i<params.length;++i){
if(typeof(args[i])=="undefined"){ //檢查輸入的參數是否為undefined
alert(fnName + ': typeof(' + params[i]+") == undefined");
return false;
}
}
return true;
}
//測試用函式1
function k( a,b,c){
checkFnParam(arguments);
}
k(); //k: typeof(a) == undefined
k("t1"); //k: typeof(b) == undefined
k("t1","t2"); //k: typeof(c) == undefined
k("t1","t2","t3"); //
k("t1","t2","t3","t4"); //
//測試用函式2
function anotherFunction(k1,k2){
checkFnParam(arguments);
}
anotherFunction(); //anotherFunction: typeof(k1) == undefined
anotherFunction("a"); //anotherFunction: typeof(k2) == undefined
anotherFunction("a","b");
//測試用函式3 (匿名函式)
var k2=function(a1,b1,c1){
checkFnParam(arguments);
}
k2(); //anonymous: typeof(a1) == undefined
測試用頁面。(firefox + ie6 測試無誤)
http://tonylovejava.googlepages.com/testCheckFnParam.html
--
難得看到讓我有興趣去細想跟寫demo的問題 XD
--
▄▅▆▇███▇▆▅▄▃ ╰┼╯─╮ ╮
◥███████████◣ ╰┼╯=│=│
◥██████───────◣ *. ╯ ╯ ╯ の 物 語 .*
◥███████──────◣ ~ ◢◣ ◢◣
◥██████───────◤ ◥◤* 空白的世界.翼
*◥◤
◥██▁▂▃▄▅▆▇███▆▅▄▃▂▂
~telnet://tony1223.twbbs.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.218.161
※ 編輯: TonyQ 來自: 220.133.218.161 (01/16 21:49)
1F:推 gpmm:所謂年紀越大性致會漸漸衰退?(無誤 XDD 01/16 22:21
2F:推 Crow22312:這解法真是好讚的一個方式喔 :P 01/16 22:27
3F:→ Crow22312:連每次都重新定義都省了 A_A 01/16 22:27
4F:→ TonyQ:gpmm 倒也不是,是有些問題重複太多次,重複到都懶得回了... 01/16 22:39
5F:→ TonyQ:我是覺得這個問題還蠻有趣的,坦白說以前還真的從沒想過可以 01/16 22:40
6F:→ TonyQ:這樣玩,所以我也覺得很有興致。 XD 01/16 22:40
7F:推 gpmm:我是開玩笑的,對於過度規律出現的問題一定會漸漸麻痺 01/16 23:05
8F:→ gpmm:但是看到有去的東西又忍不住熱情去手癢玩兩下 01/16 23:06
9F:→ gpmm:標準的熱血工程師啊 XDD 01/16 23:06
10F:→ TonyQ:希望我退役之後還是一樣熱血 v.v 最近寫什麼都沒啥動力... 01/17 21:53
11F:→ grence:function.length可以取得 function定義的參數個數 01/18 01:47
12F:→ grence:也許可以用這個取代掉正規式的部分 01/18 01:47
13F:→ grence:如果可以檢查 傳入參數跟 定義參數 的個數差異 01/18 01:59
14F:→ grence:就可以在 JavaScript做到 overloading 01/18 01:59
16F:→ grence:以上是有點離題的引申XD 01/18 02:00
17F:→ TonyQ:我知道有上面這個作法, 但是這樣就拿不到函式所定義的param 01/18 10:23
18F:→ TonyQ:name , 至於在 js 做 overloading ,這本來就是裡。密技. XD 01/18 10:24
19F:→ TonyQ:不過我是覺得值得多花費功夫去寫判斷式的overloading並不多 01/18 10:24
20F:→ TonyQ:像是jQuery的 $這類的函式比較有價值 ,或者是比較單純的 01/18 10:25
21F:→ TonyQ:getter/setter . 01/18 15:47
22F:→ grence:取 para name的用途好像也還好.一行能解決就不想包成func 01/18 20:10
23F:推 Kelunyang:可以好奇的問一下JS可以作向C#裡的setter&getter嗎? 01/18 20:35
24F:→ TonyQ:包成fn 還有能讓語意更清晰的效果 XD 01/18 22:57
25F:→ TonyQ:C#裡面的哪一種getter 跟setter ? 01/18 22:57
26F:→ TonyQ:不過我是覺得這是題目定義的問題,我一開始直覺也是想到你 01/18 22:59
27F:→ TonyQ:說得這種,不過要拿param name有時候有他的考量就是了。 01/18 22:59
28F:→ TonyQ:另外你沒有去取callee,你也拿不到function nameXD 01/18 23:00
29F:推 othree:沒辦法作 getter, setter 喔,還是要 function call 的寫法 01/19 11:17