来自 新葡亰服务器 2019-11-27 16:48 的文章
当前位置: 澳门新葡亰app > 新葡亰服务器 > 正文

让JavaScript拥有类似Lambda表达式编程能力的方法

唯独自身后来也跟人说,因为选用的参数太多,所以假如不把智能提醒写得很明亮的话,连本人要好都常常搞不清楚该怎么用。 可是,选拔参数多,除了轻松弄错用法以外,还或许会生出另多个标题,那也是自己编写出前天发布的这几个东西的自始自终的经过。 来看一下JS版的页码显示组件的一丝一毫版函数具名: 复制代码 代码如下: function pnView( currentPage, actionCurrent, beginPage, endPage, actionBegin, actionEnd, currentSiblings, actionCurrentSibling, preventFolding, actionFolding, endOfBegin, beginOfEnd, actionBeginSibling, actionEndSibling ) 能够看看,那些能够最大开间实行自定义的一丝一毫版函数签名,选用14个参数,而里面有一半——也正是7个参数,是要承当回调函数的。 因而产生的难点正是亟需手工业写入多次的“function(){}”等字符组合,就如这么: 复制代码 代码如下: function ww { document.write { ww(' ; } pnView { ww }, 1, 27, function { ww('|< ' + n + ' '); }, function { ww(' [' + n

  • ' >|]()'); }, 2, ws, 1, function ; }, 2, 2, ws, ws ); 当作者在网页中测量试验这一个组件的时候本人就感觉温馨非常怀恋C#中的拉姆da表明式——固然有一些人、有个别JS框架会把无名氏函数称作“Lambda表明式”,但实在这里只相当于C#中的“无名委托/函数”,而拉姆da的表征是行使简便的语法形式来呈现几个的逻辑,而不被“delegate”恐怕别的什么主要字分散精力。 出于那样的来由,小编编写了那个能够转译JS代码、把豆蔻梢头种特定的情势翻译成函数定义的模块。 在应用那么些模块然后,后边的十三分调用能够改为这一个样子: 复制代码 代码如下: eval { var ww = ; var ws = (n, ww(' ; pnView(14, (n, ww, 1, 27, (n, ww('|< ' + n + ' ')), (n, ww(' ' + n + ' >|')), 2, ws, 1, , 2, 2, ws, ws ); }.lamda; 模块的总体代码如下: 复制代码 代码如下: /*! L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript. Created By NanaLich. 2010-09-08 This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it. */ !function () { function attachEntry { var i, j, n; o = [].concat; //if ) o = [o]; while { for { if i[n] = m; } } } var rx0 = /^s*s*,$/; var rx1 = /((s*0s*,|(?:s*[a-z_$][w$]*s*,)+)|"*"|'*'/gi; var rx2 = /)/g; function rxGetFlags { // 抽取正则表达式的创办选项 return + (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : ''); //return //$/.exec[1]; } attachEntry(RegExp, ['getFlags'], rxGetFlags); attachEntry(RegExp.prototype, ['getFlags'], function () { return rxGetFlags; function translateLambda != 'string') s = '' + s; var x = new RegExp(rx1.source, rx1.getFlags; var y = new RegExp(rx2.source, rx2.getFlags; // 由于firefox、safari等浏览器对全局相称正则表明式有过于的优化,所以这里运用意气风发种迂回的情势创设不重复的正则表明式实例 var m, l = 0, r = ''; while { var c = m[0], h, p, q, t; switch { // 判别期望的语法成分 case '$': case ')': case ']': case '"': case "'": continue; // 函数字传送参,跳过 } h = m[2]; if h = ''; else h = h.substr; // 去掉末尾的逗号 r += s.substring; // 在结果字符串上附加以前残留的情节y.lastIndex = l = p + c.length; // 从逗号之后初阶物色右括号 while { q = q.index; try { t = 'return ' + s.substring + ';'; new Function; // 语法测量检验 //r += c + 'function{ ' + translate兰姆da + ' }'; // 翻译里面包车型地铁内容 r += m[1] + 'function{ ' + translateLambda + ' }'; // 翻译里面包车型客车剧情 x.lastIndex = l = q + 1; // 下一遍搜索从括号之后起头break; } catch l = p; // 表达找不到右括号照旧有效的代码,直接附加全部匹配的从头到尾的经过 } try { r += s.substr; if (/[w$]*|"*"|'*'/.exec // 粗略决断发生的是还是不是函数 r = '0,' + r; // 使用这种“怪”情势得以在具有浏览器中拿到预期的效果 new Function; // 语法测量试验 return r; } catch { // 战败,再次来到原来的文章 return s; } }; var lamdaAliases = ["translateLambda", "lambda", "lamda"]; attachEntry([Function, String], lamdaAliases, translateLambda); attachEntry([Function.prototype, String.prototype], lamdaAliases, function () { return translateLambda; 如果和C#中的Lambda表达式相比较来说,我的那些模块仍有成都百货上千相差的,可是现在以此样子已经让自家很舒心了,起码自身绝不再写太多的“function”了。 简单的话,这几个模块的条件性情是如此的—— 优点: 收缩编写代码时“function”的面世次数; 使用能够在相近的JavaScript编辑器中平常编辑的语法格局,直接写在函数体中不会促成语法错误。 局限性: 在其余时候利用这些模块都必得调用转译方法(“translateLambda”、“lambda”也许“lamda”卡塔 尔(英语:State of Qatar)和eval函数,无法省略; 假若存在二个函数A,不恐怕通过对A进行拍卖来完毕账和转账译传递至A的参数的目标如故相似的操作并不会让a等同于a{ return x * 2; })卡塔尔国; 无法富含表明式之外的别的语句、不可能包蕴使用“;”来分隔的多条语句。 劣势: 延续出现的括号大概会让代码变得难以通晓; 任何编辑器都无法儿为拉姆da表明式提供语法高亮; 存在错误地转译现成代码的恐怕——那一个模块选用举行相配的形式是在健康的代码中并未有实用价值、也经常见到不会师世的方式,如:等价于单纯的x * 2、等价于单纯的a.method(),所以那么些毛病影响到骨子里代码的恐怕Infiniti趋近于0。 以下是三种不宜的用法: 1、使用这么些模块并不会省去成千上万代码量的时候:太阿倒持。 复制代码 代码如下: eval{ // 不止没减少代码量,反而还扩大了 window.onload = ; }.lambda; 2、对选拔参数的函数实行转译处理:以前早就涉嫌过这种景观。 复制代码 代码如下: eval); // somefunction恐怕会生出预想外的结果,而且收到的参数会是x.toString的结果(假如x在那边并未被定义过,还只怕会生出三个“变量不设有”的十一分卡塔尔,而非三个回调函数。 3、为了接纳此模块而逃匿语法检查: 因为运用的是在JavaScript中有效但无实用价值的语法,所以走避语法检查是全然未有须求的。 复制代码 代码如下: eval("somefunction".lamda; // 失去了语法检查,或者在运行的时候发出意料之外4、在Lambda中运用过多的操作,以至多条语句: 在设计那么些模块的时候笔者并未找寻能够使用多条语句且能够透过语法检查的方式,原因是在拉姆da表明式中运用多条语句时,“function”、“return”等多少个字符所扩展的代码量经常是足以忽视的,那样去选取Lambda表达式本人就归于生机勃勃种偏离了最初的愿景的做法。 复制代码 代码如下: eval{ somefunction; return x.toString; // 语法错误 eval{ somefunction, x.toString; // 轻便产生精晓上的歧义 eval{ somefunction(); // 简单的表明式能够被选择最棒使用项所: 将来好些个个人写JavaScript的时候喜欢把温馨的代码都写在一个闭包里面,那样能够幸免全局成效域污染问题,就如这么: 复制代码 代码如下: { // 全数的代码都坐落此处 })(); ——而这种“大”闭包正巧是行使本模块的特级场合: 复制代码 代码如下: eval{ // 括号前增添eval // 全部的代码都献身此处 }.lamda; // 括号里增添.lamda() 几天前codeplex抽疯,代码和release上传总出错。再思忖到那个模块的施用途所相比单薄,不适合贫乏JavaScript经历的人接受,所以不其它提供源代码打包下载——有须要的话请直接从文中复制。

本文由澳门新葡亰app发布于新葡亰服务器,转载请注明出处:让JavaScript拥有类似Lambda表达式编程能力的方法

关键词: