Я не думаю, что 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(){}
во всем вашем коде.Некоторый вид сокращенного литерального синтаксиса функции (а не вышеупомянутое закрытие выражения наполовину), который интерпретировался так же, как и обычный многословный литерал функции, сделал бы мой код немного менее смешным.И это может помочь минимизировать чуть-чуть .