Ego*_*gon 5 javascript alias function
创建"新函数"别名的最短路径(字符)是什么.
基本上这是代码高尔夫和缩小代码超出理由.所以,当你经常写:
a=function(a,b,c){return a+b+c;}
Run Code Online (Sandbox Code Playgroud)
你可以编写类似的东西(也让我们用抽象的return关键字和全局变量R):
a=$("a,b,c","R=a+b+c")
a=$(a,b,c){R=a+b+c}
Run Code Online (Sandbox Code Playgroud)
(不确定第二个是否可行.)
对于第一个例子,我提出的最好的是:
$=function(a,b){return new Function(a,"R=0;"+b+";return R")}
Run Code Online (Sandbox Code Playgroud)
尺寸(使用,声明)都很重要,但使用尺寸更重要.
Moo*_*Goo 18
new Function()
即使没有性能问题,我认为大多数功能都不可行,因为function() {}
不会产生任何闭包.已编译的函数只能访问自己的本地范围和全局对象.这点考虑一下吧.没有闭包的Javascript就像没有类的Java或没有指针的C.显然一切都会破裂.
无论如何,如果你只打算将这个别名用于不需要clousers的短lambada表达式,那么让事情更简洁的一个显而易见的方法是省去参数减速.简单地假设a = arguments[0]; b = arguments[1];
等......
$=function(b){return new Function('a,b,c,d,e,f,g,h,i,j', b);};
Run Code Online (Sandbox Code Playgroud)
另一种方法是自动返回最后一个表达式的值,而不是需要显式声明它
$=function(body) {
return function(a,b,c,d,e,f,g,h,i,j) { return eval(body); };
};
Run Code Online (Sandbox Code Playgroud)
令人震惊的不是吗?这是因为eval()
......它返回最后一个计算表达式的值.不需要return
.当然,这种方法对性能的影响更大,因为body
每次调用函数时都会重新评估代码,而new Function
代码是(或应该)只编译一次.
无论如何,使用前面的方法可以阻止性能,你的功能声明就是这个
var myeyes = $('a+b+c');
alert(myeyes(1,2,3)); //6
Run Code Online (Sandbox Code Playgroud)
Purdy吧?不过,我认为这样看起来会更好
'a+b+c'
Run Code Online (Sandbox Code Playgroud)
看起来像一个字符串是吗?嗯...这是一个刺痛,但在正确的功能的手中,它可以被评估,就好像它是一个完整的函数文字
//Lets just assume that IE does not exist mmkay?
var funcs = ['map', 'filter', 'every', 'some'];
for (var i=0; i<funcs.length; i++) {
(function() {
//Store original function
var name = funcs[i]
var _super = Array.prototype[name];
Array.prototype[name] = function() {
//$ !== jQuery
if (typeof arguments[0] == 'string') arguments[0] = $(arguments[0]);
return _super.apply(this, arguments);
};
}());
}
Run Code Online (Sandbox Code Playgroud)
现在你可以写了
[1,2,3,4,5].map('a*a');
Run Code Online (Sandbox Code Playgroud)
代替
[1,2,3,4,5].map(function(a){return a*a;});
Run Code Online (Sandbox Code Playgroud)
这甚至比Firefox的Expression Closure更好
[1,2,3,4,5].map(function(a) a*a);
Run Code Online (Sandbox Code Playgroud)
在这里尝试一下: http://jsbin.com/iyogu3/edit
如果我们实际上只能编写这样的函数表达式而不需要调用eval怪物.实际上,我对Javascript语法的一个主要抱怨是要求在function(){}
整个代码中使用垃圾邮件.某种类型的速记函数文字语法(不是前面提到的半合成表达式闭包)被解释为与常规详细函数文字相同,这将使我的代码看起来不那么荒谬.它也可能有助于缩小一点点.