Re: [問題] 一個關於匿名函式與變數區域分類問題

看板Ajax作者 (^^)時間15年前 (2010/01/16 21:47), 編輯推噓5(5024)
留言29則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《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)

01/16 22:21, , 1F
所謂年紀越大性致會漸漸衰退?(無誤 XDD
01/16 22:21, 1F

01/16 22:27, , 2F
這解法真是好讚的一個方式喔 :P
01/16 22:27, 2F

01/16 22:27, , 3F
連每次都重新定義都省了 A_A
01/16 22:27, 3F

01/16 22:39, , 4F
gpmm 倒也不是,是有些問題重複太多次,重複到都懶得回了...
01/16 22:39, 4F

01/16 22:40, , 5F
我是覺得這個問題還蠻有趣的,坦白說以前還真的從沒想過可以
01/16 22:40, 5F

01/16 22:40, , 6F
這樣玩,所以我也覺得很有興致。 XD
01/16 22:40, 6F

01/16 23:05, , 7F
我是開玩笑的,對於過度規律出現的問題一定會漸漸麻痺
01/16 23:05, 7F

01/16 23:06, , 8F
但是看到有去的東西又忍不住熱情去手癢玩兩下
01/16 23:06, 8F

01/16 23:06, , 9F
標準的熱血工程師啊 XDD
01/16 23:06, 9F

01/17 21:53, , 10F
希望我退役之後還是一樣熱血 v.v 最近寫什麼都沒啥動力...
01/17 21:53, 10F

01/18 01:47, , 11F
function.length可以取得 function定義的參數個數
01/18 01:47, 11F

01/18 01:47, , 12F
也許可以用這個取代掉正規式的部分
01/18 01:47, 12F

01/18 01:59, , 13F
如果可以檢查 傳入參數跟 定義參數 的個數差異
01/18 01:59, 13F

01/18 01:59, , 14F
就可以在 JavaScript做到 overloading
01/18 01:59, 14F

01/18 02:00, , 16F
以上是有點離題的引申XD
01/18 02:00, 16F

01/18 10:23, , 17F
我知道有上面這個作法, 但是這樣就拿不到函式所定義的param
01/18 10:23, 17F

01/18 10:24, , 18F
name , 至於在 js 做 overloading ,這本來就是裡。密技. XD
01/18 10:24, 18F

01/18 10:24, , 19F
不過我是覺得值得多花費功夫去寫判斷式的overloading並不多
01/18 10:24, 19F

01/18 10:25, , 20F
像是jQuery的 $這類的函式比較有價值 ,或者是比較單純的
01/18 10:25, 20F

01/18 15:47, , 21F
getter/setter .
01/18 15:47, 21F

01/18 20:10, , 22F
取 para name的用途好像也還好.一行能解決就不想包成func
01/18 20:10, 22F

01/18 20:35, , 23F
可以好奇的問一下JS可以作向C#裡的setter&getter嗎?
01/18 20:35, 23F

01/18 22:57, , 24F
包成fn 還有能讓語意更清晰的效果 XD
01/18 22:57, 24F

01/18 22:57, , 25F
C#裡面的哪一種getter 跟setter ?
01/18 22:57, 25F

01/18 22:59, , 26F
不過我是覺得這是題目定義的問題,我一開始直覺也是想到你
01/18 22:59, 26F

01/18 22:59, , 27F
說得這種,不過要拿param name有時候有他的考量就是了。
01/18 22:59, 27F

01/18 23:00, , 28F
另外你沒有去取callee,你也拿不到function nameXD
01/18 23:00, 28F

01/19 11:17, , 29F
沒辦法作 getter, setter 喔,還是要 function call 的寫法
01/19 11:17, 29F
文章代碼(AID): #1BKSE7cT (Ajax)
文章代碼(AID): #1BKSE7cT (Ajax)