Ajax 板


LINE

var input = [],output=[]; var input1=[],output1=[]; function times(n, f) { var c=0; return function() { var args = []; for(var i=0,j=arguments.length; i<j; i++) { alert("[i=" + i + "][c=" +c+ "]: " +arguments[i]); //<-增加了这行观测 args.push(arguments[i]); } if(c<n) { c++; return f.apply(this, args); } else { return null; } }; } var work = function(res) { return res.shift(); }; var f1 = times(10, work); var r1 = function(res, f) { var ret = f(res); if(null !== ret) { output.push(ret); r1(res, f); } }; var r2 = function(n) { for(var i=0; i<n; i++) { output1.push(work(input1)); } }; function test1() { input = [0,1,2,3,4,5,6,7,8,9]; output = []; r1(input, f1); } function test2() { input1 = [0,1,2,3,4,5,6,7,8,9]; output1 = []; r2(10); } var count = 100000; var d1 = new Date().getTime(); for(var i=0; i<count; i++) { test1(); } var d2 = (new Date().getTime()) - d1; var d3 = new Date().getTime(); for(var i=0; i<count; i++) { test2(); } var d4 = (new Date().getTime()) - d3; alert(d2); alert(d4); ---------------------------------------------- 以上程式我只增加了一行观测用 alert("[i=" + i + "][c=" +c+ "]: " +arguments[i]); 发现问题出在 var c变数 由於times 传回一个匿名函式 该匿名函式为一closure c这个变数 由於closure的关系 将一直维持private的存在 所以当执行一万次test1时 for(var i=0; i<count; i++) { test1(); } 只有第一次 c会由0-9 正常运作 後面的9999次test1 的执行 c都维持在10 也就是times fumction 一进去就跳出来 因为c>n 等於没执行 所以并不是test1的执行效率比test2高 而是test1只真正执行了一次 而test2执行了一万次 程式执行中 若觉得alert 10000次按的很辛苦 请用程式管理员直接结束ie or ff --------------------------------------------- 解决这个问题的方法如下 function test1() { input = [0,1,2,3,4,5,6,7,8,9]; output = []; r1(input, times(10, work)); } test1 里面 r1(input,f1) 改成r1(input, times(10, work)) 这两者是有差异的 times(10, work) 每次都会执行一遍 所以回传的匿名函式 c值重新归零 f1是一个指向传回来的匿名函式的指标 那个匿名函式一直没变 所以总结来说 应该是times的用法用错了 不能用f1= times(10, work);这样的写法 times函式每次使用时都必须呼叫一遍取得新的匿名函式 而不能只呼叫一遍 如果一定要用f1= times(10, work);这句则必须摆在r1之前如下: function test1() { input = [0,1,2,3,4,5,6,7,8,9]; output = []; f1= times(10, work); r1(input, f1); } --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.70.99.74 ※ 编辑: sk1765 来自: 203.70.99.74 (01/24 02:26) ※ 编辑: sk1765 来自: 203.73.175.240 (01/24 12:14) ※ 编辑: sk1765 来自: 203.73.175.240 (01/24 12:18)
1F:推 fillano:感谢阿 01/31 10:08







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP