在javascript中创建“新函数”别名的最短方法

时间:2010-08-07 18:36:53

标签: javascript function alias

创建“新功能”别名的最短路径(字符)是什么。

基本上这是代码高尔夫和超出理由的代码。 所以,当你经常写:

a=function(a,b,c){return a+b+c;}

您可以编写类似的内容(也可以使用抽象的return关键字以及全局变量R):

a=$("a,b,c","R=a+b+c")
a=$(a,b,c){R=a+b+c}

(不确定第二个是否可行。)

对于第一个例子,我提出的最好的是:

$=function(a,b){return new Function(a,"R=0;"+b+";return R")}

尺寸(用法,声明)都很重要,但使用尺寸更重要。

5 个答案:

答案 0 :(得分: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);};

另一种方法是自动返回最后一个表达式的值,而不是要求它显式声明

$=function(body) {
  return function(a,b,c,d,e,f,g,h,i,j) { return eval(body); };
};

恐慌不是吗?这是有效的,因为eval() ...它返回最后一个计算表达式的值。不需要return。当然,这种方法对性能的影响更大,因为每次调用函数时都会重新评估body中的代码,而使用new Function代码(或应该)只编译一次。 / p>

无论如何,使用前面的方法,你的函数声明已经达到了这个

var myeyes = $('a+b+c');
alert(myeyes(1,2,3)); //6
普洱哈?不过,我认为这样看起来会更好

'a+b+c'

看起来像是一个字符串?嗯...这是一个刺痛,但在正确的功能的手中,它可以被评估,就好像它是一个完整的功能文字

//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);
      };
    }());
 }

现在你可以写

[1,2,3,4,5].map('a*a');

而不是

[1,2,3,4,5].map(function(a){return a*a;});

甚至比Firefox的Expression Closure更好

[1,2,3,4,5].map(function(a) a*a);

在此处试用: http://jsbin.com/iyogu3/edit

如果我们实际上只能编写这样的函数表达式而不需要调用eval怪物。实际上,我对Javascript语法的一个主要抱怨是要求在整个代码中发送垃圾邮件function(){}。某种类型的速记函数文字语法(不是前面提到的半合成表达式闭包)被解释为与常规详细函数文字相同,这将使我的代码看起来不那么荒谬。它也可能有助于缩小微小的

答案 1 :(得分:1)

对于简单表达式,您可以使用:

function L(a,x){return new Function(a,'return '+x)}

用法:

n=L('a,b,c','a+b+c');

答案 2 :(得分:0)

这是一个具有更大开销但每个函数定义保存一个字符的变体。 “@”将替换为“return”。

$=function(a,b){return new Function(a,b.replace(/@/g,"return "))}
a=$("a,b,c","@a+b+c")

答案 3 :(得分:0)

你可能会从愚蠢的事情中获得里程:

eval("t=Fa+b};t(1,2)".replace("F", "function(a,b){return "))

答案 4 :(得分:0)

您的代码: a=function(a,b,c){return a+b+c;}

缩短代码 a=(a,b,c)=>a+b+c

js中可能的最短函数声明是4个字符

示例: _=>1