Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Век живи, век учись и максимусом помрёшь (https://javascript.ru/forum/offtopic/46477-vek-zhivi-vek-uchis-i-maksimusom-pomrjosh.html)

Aetae 15.04.2014 08:30

Я лично против "кода в строке", в любом его виде. Попахивает.

И так для вас ввели:
Пример: JavaScript 1.8
alert( (function(x,y)x+y)(1,2) );
что ещё надо то?)

kobezzza 15.04.2014 09:24

Цитата:

Сообщение от Aetae (Сообщение 307747)
Я лично против "кода в строке", в любом его виде. Попахивает.

И так для вас ввели:
Пример: JavaScript 1.8
alert( (function(x,y)x+y)(1,2) );
что ещё надо то?)

alert(((x, y) => x + y)(1, 2));


Правд нативно это тока в ФФ, но я уже больше года юзаю трансляторы и всё не нарадуюсь :)

kobezzza 15.04.2014 09:33

Цитата:

Сообщение от DjDiablo (Сообщение 307736)
Интересно а оправдан ли чем то вот такой подход (просто в голову стукнуло).
Здесь кодогенерация сведена к минимуму, а расходы памяти такие же как если бы все функции были бы объявлены заранее.

function F(args, body) {
    F.cache=F.cache||{};
    F.cache[args+body]=F.cache[args+body]||new Function(args, "return " + body);
    return F.cache[args+body];
}
      
alert(F("x,y","x+y")(1, 2));

Есть кейсы где оправдан, но твой пример не учитывает слишком много нюансов.

В своём Collection я уже давно ввёл поддержку строковых сокращений для фильтров в дополнение к простым функциям:

$C([1,2,3]).get(':el > 2');


Или же:

$C().addFilter({
    'filter1': function () {},
    'filter2': function () {},
    'filter3': function () {},
    'filter4': 'filter3 || filter2'
});

$C([1,2,3]).get('filter1 && filter2 || filter4');


Первый вариант на практике оказался очень удобным применительно в шаблонах:
https://github.com/kobezzza/Snakeskin#foreach-1

но в JS с введением Arrow Function от него мало проку.

А вот второй вариант оказался очень удобным и я регулярно его использую.

Maxmaxmaximus42 16.04.2014 01:05

а я юзаю кофесткрипт, меня тим перубедил и он был прав, и даже круглые скобки не ставлю теперь

Octane 30.04.2014 23:10

Как смотрите на то, чтобы маркировать тип переменной с помощью меток?
function example1() {
	integer:var index;
	string:var name;
}

function example2() {
	integer:var index;
	integer:var count;
	string:var name;
	string:var value;
}

function example3() {
	integer:var index, count;
	string:var name, value;
}

function example4() {
	integer:var index = 1, count;
	string:var name, value = "none";
}

UglifyJS может автоматически поудалять эти метки, для продакшион версии.

kobezzza 01.05.2014 09:34

Не выдумывай и юзай JSDoc или Dart/TypeScript :)

DjDiablo 01.05.2014 13:00

Цитата:

Сообщение от kobezzza (Сообщение 309989)
Не выдумывай и юзай JSDoc или Dart/TypeScript :)

Точнее и не скажешь)

Octane 02.05.2014 20:53

Цитата:

Сообщение от DjDiablo
Не выдумывай

так не интересно ничего не выдумывать :)

Недавно адаптировал скрипт для работы в браузере, ну и чтобы работало в IE8, убирал из скрипта NFE, например:
document.addEventListener("click", function callback(event) {
     document.removeEventListener("click", callback);
     …
});

нужно переделать в:
function callback(event) {
     document.removeEventListener("click", callback);
     …
}
document.addEventListener("click", callback);
Но это муторно все функции переделывать в FD, иногда имена совпадают, не всегда нужны эти функции в общем скопе и т.д.
arguments.callee использовать нельзя, потому что весь код в strict режиме исполняется в нормальных браузерах.
Можно облегчить себе жизнь, написав функцию, наподобие bind, но выполняющую привязку только для первого аргумента, и в качестве значения этого аргумента должна отправляться ссылка на bound-функцию:
function nfe(targetFunc) {
    function boundFunc() {
        Array.prototype.unshift.call(arguments, boundFunc);
        return targetFunc.apply(this, arguments);
    }
    return boundFunc;
}

Теперь можно делать так:
document.addEventListener("click", nfe(function (callback, event) {
    document.removeEventListener("click", callback);
    …
}));

или так:
setTimeout(nfe(function (onTime) {
    …
    setTimeout(onTime, 100);
}), 100);


Часовой пояс GMT +3, время: 16:52.