Век живи, век учись и максимусом помрёшь
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, время: 02:09. |