eval(function(){ // 不仅没减少代码量,反而还增加了
window.onload = (0, alert('载入完成!'));
}.lambda());
2、对接受参数的函数进行转译处理:之前已经提到过这种情况。
复制代码 代码如下:
eval(somefunction.lambda())((x, x.toString(16))); // somefunction可能会产生预料外的结果,而且收到的参数会是x.toString(16)的结果(如果x在此处并没有被定义过,还会产生一个“变量不存在”的异常),而非一个回调函数。
3、为了使用此模块而规避语法检查:
因为使用的是在JavaScript中有效但无实用价值的语法,所以规避语法检查是完全没有必要的。
复制代码 代码如下:
eval("somefunction((x, x.toString(16)))".lamda()); // 失去了语法检查,可能在运行的时候产生意外
4、在(伪)Lambda中使用过多的操作,甚至多条语句:
在设计这个模块的时候我并没有找出可以使用多条语句且可以通过语法检查的模式(pattern),原因是在Lambda表达式中使用多条语句时,“function”、“return”等几个字符所增加的代码量通常是可以忽略的,这样去使用Lambda表达式本身就属于一种偏离了初衷的做法。
复制代码 代码如下:
eval(function(){ somefunction((x, y.something(x); return x.toString(16))); }.lamda())(); // 语法错误
eval(function(){ somefunction((x, y.something(x), x.toString(16))); }.lamda())(); // 容易产生理解上的歧义
eval(function(){ somefunction((x, ++x)); }.lamda())(); // 简单的表达式可以被接受
最佳使用场合:
现在很多人写JavaScript的时候喜欢把自己的代码都写在一个闭包里面,这样可以避免全局作用域污染问题,就像这样:
复制代码 代码如下:
(function(){
// 所有的代码都放在这里
})();
——而这种“大”闭包正好是使用本模块的最佳场合:
复制代码 代码如下:
eval(function(){ // 括号前增加eval
// 所有的代码都放在这里
}.lamda())(); // 括号里增加.lamda()
昨天codeplex抽疯,代码和release上传总出错。再考虑到这个模块的使用场合比较有限,不适合缺乏JavaScript经验的人使用,所以不另外提供源代码打包下载——有需要的话请直接从文中复制。
您可能感兴趣的文章: