Кратчайший способ создания псевдонима «новая функция» в JavaScript - PullRequest
5 голосов
/ 07 августа 2010

Какой кратчайший путь (символы) для создания псевдонима «новая функция».

В основном это для гольф-кода и минимизации кода без причины. Поэтому, когда вы обычно пишете:

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 ]

18 голосов
/ 08 августа 2010

Я не думаю, что new Function() подходит для большинства функций даже без проблем с производительностью, потому что в отличие от function() {} замыкание не создается.Скомпилированная функция будет иметь доступ только к своей локальной области видимости и глобальному объекту.Подумайте об этом на секунду.Javascript без замыканий подобен Java без классов или C без указателей.Ясно, что все сломалось бы.

В любом случае, если вы собираетесь использовать этот псевдоним только для коротких лямбад, таких как выражения, которые не нуждаются в clousers, один очевидный способ сделать вещи еще более лаконичными - это исключить замедление параметров.Просто предположим, что 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 код компилируется (или должен быть) только один раз.

В любом случае производительность будет подавлена, с предыдущим методом ваше объявление функции будет ниже до

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

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

Попробуйте здесь: http://jsbin.com/iyogu3/edit

Если толькомы могли бы написать такие выражения функций без вызова eval-монстра.Действительно, одна из моих основных проблем с синтаксисом Javascript - это требование спама function(){} во всем вашем коде.Некоторый вид сокращенного литерального синтаксиса функции (а не вышеупомянутое закрытие выражения наполовину), который интерпретировался так же, как и обычный многословный литерал функции, сделал бы мой код немного менее смешным.И это может помочь минимизировать чуть-чуть .

1 голос
/ 07 августа 2010

Для простых выражений вы можете использовать:

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

Использование:

n=L('a,b,c','a+b+c');
0 голосов
/ 19 июля 2017

Ваш код: a=function(a,b,c){return a+b+c;}

Сокращенный код: a=(a,b,c)=>a+b+c

Самое короткое объявление функции, возможное в js, составляет 4 символа

Пример: _=>1

0 голосов
/ 08 августа 2010

Вы могли бы получить milage из чего-то глупого как:

eval("t=Fa+b};t(1,2)".replace("F", "function(a,b){return "))
0 голосов
/ 07 августа 2010

Вот вариант, который имеет большие издержки, но сохраняет один символ на определение функции. «@» будет заменено на «возврат».

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