作者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