|
Получить имя функции внутри функции не используя 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, время: 04:47. |
|