Цитата:
|
Цитата:
Цитата:
Может быть это и изыск, но, согласитесь, удобнее) |
Цитата:
|
Цитата:
Зачем тогда придумали слово 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, время: 11:11. |