Век живи, век учись и максимусом помрёшь
var myString = function () {
/*
многостройчный
текст
вот
вроде всё просто но сам бы не догадался
оно мне и не нужно, ибо кофескрипт.... но всё равно интересная штука
*/
}.toString().match(/\*((.|[\r\n])*)\*/)[1];
alert(myString);
p.s.: делимся интересными трюками |
|
/** @namespace Function.prototype.__doc__ */
Object.defineProperty(Function.prototype, '__doc__', {
/** @this Function */
get: function ( ) {
'use strict';
var comment = this.toString(),
__doc__ = '';
if (comment = comment.match(/\/\*[!*]([^S\/]+)\*\//))
__doc__ = comment[1];
return __doc__;
}
});
monolithed, Да так интереснее +++ ой, блин https://avatars0.githubusercontent.com/u/803674?s=400 monolithed это ты??? о_0 |
Цитата:
|
monolithed,
function test() {
/** S */
}
console.log(test.__doc__);
Отчего не любишь "S"?:) |
Вообще, мне кажется более уместной такая регулярка:
/\/\*[!*]([\s\S]+?)\*\// |
Tim, чёт я не понял, а зачем этот хак может в принципе понадобится? это же какой то ад :)
|
Цитата:
|
kobezzza, Gozar,
Я знаю, не провоцируйте холивар пож-та, лучше кусок интересного кода запостите |
fuck = "насиловать"
text = " Этот текст написан на кофескрипте Если хочется сахара то используйте его, а не пытайтесь #{fuck} js " и кстати, нет НИ ОДНОЙ логической причины прерывать строку красной строкой, совершенно очевидно что если кавычка не закрылась и идет красная строка, то эта красная строка часть текста. Я воспринмиаю эту нелепость как укоренившеюся ошибку парсера js. |
Цитата:
|
Цитата:
test('/***.../', function () {
var test = function () {
/***/
/*!*/
/**/
//
};
equal(test.__doc__, '');
});
|
Цитата:
Цитата:
Цитата:
В Python например, пошли еще дальше, и включили работу с Docstring в REPL. # *.py def function (): ''' Empty function ''' ...
➜ python
python> help()
help> print
function ()
'Empty function'
|
Цитата:
/\/\*[!*]([\s\S]*?)\*\//:) Она и с флагом g вроде корректно ищет. |
Цитата:
|
Цитата:
function F(args, body) {
return new Function(args, "return " + body);
}
array.map(F("x", "x * x"));
array.filter(F("x", "x % 2"));
array.sort(F("a, b", "Math.sign(a - b)"));
if (array.every(F("x", "x === true"))) {
…
}
Но так и не решаюсь использовать в реальном коде из-за предрассудков о кодогенерации :-? |
Цитата:
|
Цитата:
|
Интересно а оправдан ли чем то вот такой подход (просто в голову стукнуло).
Здесь кодогенерация сведена к минимуму, а расходы памяти такие же как если бы все функции были бы объявлены заранее.
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));
|
Кстати IE11 сам умеет оптимизировать, цикл с деятком тысяч итераций вызывает F за несколько миллисекунд, если тело не меняется.
|
Я лично против "кода в строке", в любом его виде. Попахивает.
И так для вас ввели: Пример: JavaScript 1.8
alert( (function(x,y)x+y)(1,2) );что ещё надо то?) |
Цитата:
alert(((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 от него мало проку. А вот второй вариант оказался очень удобным и я регулярно его использую. |
а я юзаю кофесткрипт, меня тим перубедил и он был прав, и даже круглые скобки не ставлю теперь
|
Как смотрите на то, чтобы маркировать тип переменной с помощью меток?
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 может автоматически поудалять эти метки, для продакшион версии. |
Не выдумывай и юзай JSDoc или Dart/TypeScript :)
|
Цитата:
|
Цитата:
Недавно адаптировал скрипт для работы в браузере, ну и чтобы работало в 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, время: 00:46. |