|
Получить имя функции внутри функции не используя callee
Приветствую, камрады, можно ли сделать как в PHP:
public function func($in_params) { $__F__ = __FUNCTION__; ... if (...) $__F__($in_params); } чтобы не зависеть от имени функции, но не используя callee? |
Пример варианта для window
<script> function test(name) { if (typeof window[name] === "function") { window[name](); } else { alert("Function not declared") } } function one() { alert('One'); } test("one"); test("two"); </script> |
Poznakomlus, пишут ведь, что «чтобы не зависеть от имени функции». Ещё ваш вариант предполагает засорение глобального объекта, а также его изменение! Также у вас не соблюдена чистота функции. Также вы не показали, как получить функцию внутри функции не используя callee!
drwhite, в JavaScript как раз для этого и есть arguments.callee, который указывает на функцию. Однако стоит учитывать, что по имени функции не всегда возможно обратиться к самой функции, поэтому лучше говорить о ссылке на функцию. function factorial(n) { if(n % 1 !== 0 || n < 0) throw Error("n ∈ Z ⋀ n ≥ 0"); if(n === 0) return 1; return n * arguments.callee(n - 1); } alert(factorial(5)); // 5! = 120 Однако, если вы вдруг решили, что вам по каким-то причинам arguments.callee не подходит (по каким?), то вы можете использовать Y-комбинатор! var Y = f => ( g => x => f(g(g))(x) )( g => x => f(g(g))(x) ); var factorial = Y(fn => n => { if(n % 1 !== 0 || n < 0) throw Error("n ∈ Z ⋀ n ≥ 0"); if(n === 0) return 1; return n * fn(n - 1); }); alert(factorial(5)); // 5! = 120Обращение функции к самой себе вообще не предполагает наличие глобальной ссылки. Т. е. поскольку она не называет себя по имени, она не связана тесно с самой собой. |
:write: может я что-то не понимаю, но альтернативы arguments.callee в решениях выше Poznakomlus и
Malleys не увидел. |
Потому что её нет.
Если вы работаете в нестрогом режиме - у вас уже есть arguments.callee, никакого смысла в чём-то ещё нет. Если вы работаете в строгом режиме - arguments.callee у вас отобрали специально, чтобы заметно ускорить и облегчить исполнение избавившись от сложных взаимосвязей и побочек. Альтернативы, соответственно, тут принципиально не будет. |
Цитата:
Цитата:
— нет, уж лучше вы к нам» =) Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
function func($params) { ... if (...) self($params); } чтобы имя функции указывалось один раз, без лишних переменных, без NFE и в strict mode =) |
<script> function test() { try { throw new Error( "Get name") } catch (e) { console.log(e.stack); } } test(); </script> название функции есть в стеке вызовов, однако этот стек по разному работает в броузерах если я вас правильно понял |
Часовой пояс GMT +3, время: 13:07. |
|