Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить имя функции внутри функции не используя callee (https://javascript.ru/forum/misc/79421-poluchit-imya-funkcii-vnutri-funkcii-ne-ispolzuya-callee.html)

Vlasenko Fedor 07.02.2020 00:50

Malleys,
хватит тролить уже :lol:
function logTextNotes(el) {
    var n, walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
    while (n = walk.nextNode()) console.log(n);
}
logTextNotes(document.body);

рони 07.02.2020 00:58

Цитата:

Сообщение от Malleys
Обход всех текстовых узлов в DOM

:-?
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>
<body>
<div>12345</div>
<script>
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);

/* https://developer.mozilla.org/ru/docs/Web/API/document/createTreeWalker */
function textNodesLog(el){
  const tree = document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
  while(tree.nextNode()) console.log(tree.currentNode);
}
textNodesLog(document.body)
  </script>
</body>
</html>

рони 07.02.2020 01:00

Poznakomlus,
:)

Aetae 07.02.2020 01:15

ИМХО, Malleys надо бы забанить. Говорить с ним точно нет никакого смысла.
Он либо дурачок, либо тролль, либо всё вместе взятое(Maxmaxmaximus, как твой фреймворк?).

P.S. Если кому интересно откуда взялся этот его бессмысленный Y-комбинатор - в рамках js он, как и прочие комбинаторы, просто математическая зарядка для ума, самоочевидно не предназначенная ни для какого практического применения.

Malleys 07.02.2020 01:41

Poznakomlus, рони, да у вас правильное решение, но это не равнозначная замена приведённому коду (в принципе представьте обход любого дерева)
function processTextNodes(node, visit) {
	if(node == null) return;

	const stack = [];
	stack.push(node);

	while(stack.length !== 0) {
		node = stack.pop();

		if(node.nodeType === Node.TEXT_NODE)
			visit(node);

		for(const childNode of node.childNodes) {
			stack.push(childNode);
		}
	}
}

processTextNodes(document, console.log);


Цитата:

Сообщение от Aetae
ИМХО, Malleys надо бы забанить

Всё это походит на сжигание людей в средние века. На тюремные заключения в современном РФ. Что именно я сделал не так?

Цитата:

Сообщение от Aetae
Говорить с ним точно нет никакого смысла.

Я вас ни к чему не принуждаю, я прочитал вашу точку зрения насчёт не стрелочных функции, считаю ОК. А вы разве что-то у меня спрашивали?

Цитата:

Сообщение от Aetae
Он либо дурачок, либо тролль, либо всё вместе взятое

Проблемы?

Malleys 07.02.2020 01:57

Цитата:

Сообщение от Aetae
Если кому интересно откуда взялся этот его бессмысленный Y-комбинатор - в рамках js он, как и прочие комбинаторы, просто математическая зарядка для ума, самоочевидно не предназначенная ни для какого практического применения.

Хватит вводить людей в заблуждение! Оно прекрасно работает как замена классической рекурсии, о которой вы упоминали.

Вы что-то не так поняли, я как бы не против классической рекурсии.

В этой теме я упомянул Y-комбинатор, как одно из возможных решении, поскольку автор темы не указал конкретный код с которым он работает (Может на самом деле можно обойтись без рекурсии вообще!)

drwhite 07.02.2020 09:02

Цитата:

Сообщение от 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);

var Y=f=>(g=>x=>f(g(g))(x))(g=>x=>f(g(g))(x));

За такую конструкцию в средние века точно бы на костер поставили =)

Цитата:

Сообщение от Poznakomlus
Код должен быть простым и понятым

Цитата:

Сообщение от Aetae
P.S. Если кому интересно откуда взялся этот его бессмысленный Y-комбинатор - в рамках js он, как и прочие комбинаторы, просто математическая зарядка для ума, самоочевидно не предназначенная ни для какого практического применения.

Вот здесь немного есть
И здесь

Alexandroppolus 07.02.2020 09:29

Y-комбинатор, конечно, прикольный, на собеседовании вполне можно закарать соискателя )

но он втыкает несколько дополнительных вызовов на каждой итерации, что и на скорости может сказаться, и дебажить веселее (нельзя просто взять и зайти внутрь рекурсивного вызова одним нажатием на F11). В общем, вернувшись в реальность, лично я не стал бы его на практике.

----
если у кого "мозги чешутся" повоевать с лямбдами, то велкам:
https://www.codewars.com/kata/57c4a3...65b/javascript
я пока не решил, там всё не так просто как кажется на первый взгляд )
ничего парсить не надо, на вход уже готовое дерево, только вычислить

ruslan_mart 07.02.2020 13:15

Что-то пробежался по треду одним глазом, но так и не понял зачем это нужно.

Для рекурсии ничего не мешает сделать так:

const factorial = function f() {
    console.log(typeof f); // "function";
}

const factorial2 = factorial;

console.log(typeof factorial); // "function";
console.log(typeof factorial2); // "function";
console.log(typeof f); // "undefined";

factorial();
factorial2();



А для класса можно просто внутри использовать:

this.constructor



Например:

// ...
  cloneObject() {
     return new this.consructor(this.data);
  }

 // ...



Если Вам действительно нужно как-то получить имя функции, то это просто неправильный подход.
И не нужно смотреть на PHP. Все эти магические константы на PHP нужны для отладки, не более.

drwhite 12.02.2020 22:48

Как правильно реализовать такую необходимость без Node:

class Account
{
    constructor(){...}
    async DB_createAccount()
    {
        let response = await fetch('lib/actionsAJAX.php?action='+{имя функции}+'&login='this.login);
        if (response.ok) 
        {
            .....
        }
        else
        {
	
        }
    }
}


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