Цитата:
|
Цитата:
Цитата:
Может быть это и изыск, но, согласитесь, удобнее) |
Цитата:
|
Цитата:
Зачем тогда придумали слово constructor вместо имени класса? И какой подход к реализации был бы правильным? |
<script> function factorial(x) { var result = 1; while (x > 1) result *= x--; return result; } alert(factorial(5)); </script> пример факториала честно, полноту вашей задачи я до сих пор не понял хотите избавится от рекурсии используйте циклы конструктор служит для иницииализации "И какой подход к реализации был бы правильным?" тот, который понятен другим разработчикам. Чтобы они не ломали голову в раскручивани вызовов ваши функций. Код должен быть простым и понятым |
Цитата:
Цитата:
Цитата:
Скорей Y-комбинатор и замыкания вынесут моск)) PS И потом, как сделать, чтобы код был понятен другим разработчикам, прочитать много умных книг, сходить на разные «курсы», которых сейчас расплодилось как собак нерезаных? Это, положим, можно, есть ли там стандарты и правила написания правильного кода, как узнать? |
Цитата:
|
class Test1 {} class Test2 { get name(){ return this.constructor.name} } const Test3 = function () {} const Test4 = function () { this.name =()=> this.constructor.name } const a = new Test1(); const b = new Test2(); const c = new Test3(); const d = new Test4(); console.log(a.constructor.name); console.log(b.constructor.name); console.log(c.constructor.name); console.log(d.constructor.name); console.log(b.name); console.log(d.name()); console.log(Test1.name); не знаю, может это поможет |
Malleys, просто пишет чушь ради чуши.
Например хипстерское дерьмо, типа: const factorial = x => { if (x === 1) return 1; else return x * factorial(x - 1); } alert(factorial(5));после чего решает проблему которой нет. Нормальный человек напишет: function factorial(x) { if (x === 1) return 1; else return x * factorial(x - 1); }и это будет работать всегда. Даже если мы потом сделаем так: function factorial(x) { if (x === 1) return 1; else return x * factorial(x - 1); } const f = factorial; alert(f(5));или так: // factorial-module.js function factorial(x) { if (x === 1) return 1; else return x * factorial(x - 1); } export default factorial; // main.js import f from './factorial-module'; alert(f(5)); Если мы хотим пулять функцию по разным переменным сразу после создания, но при этом не хотим засорять область видимости её оригинальным названием(почему?), то всегда можно сделать так: const factorial = function fcallee(x) { if (x === 1) return 1; else return x * fcallee(x - 1); } const f = factorial; const f2 = factorial; alert(typeof fcallee); alert(factorial(5)); alert(f(5)); alert(f2(5)); Нет никакой проблемы и никакого смысла в arguments.callee, и уж точно нет смысла в онанизме от Malleys. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вот, например, более практическая задача, чем вычисление факториалов, на примере которой демонстрируется рекурсия... Обход всех текстовых узлов в DOM var Y=f=>(g=>x=>f(g(g))(x))(g=>x=>f(g(g))(x)); var processTextNodes = visit => Y(order => node => { if(node != null) node.childNodes.forEach(childNode => childNode.nodeType === Node.TEXT_NODE ? visit(childNode) : order(childNode) ) }); var logTextNotes = processTextNodes(console.log); logTextNotes(document.body);Poznakomlus, попробуйте избавиться от рекурсии и вы закончите кодом, про который не скажешь, что он, по сравнению с этим — простой, понятный и краткий! Aetae, то, что вы описали, работает с обычными функциями (и это хорошо!), а не со стрелочными. Зависит от имени... const factorial = x => x === 1 ? 1 : x * factorial(x - 1);Y-комбинатор позволяет убрать такую зависимость... import { Y } from "combinators-js"; const factorial = Y(f => x => x === 1 ? 1 : x * f(x - 1)); |
Часовой пояс GMT +3, время: 23:00. |