javascript 函数自引用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26283868/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 05:45:52  来源:igfitidea点击:

Function Self Reference

javascript

提问by Levi Lindsey

In JavaScript, functions are simply objects that can be invoked. So what is the easiest way for the body of a function to reference the actual function object?

在 JavaScript 中,函数只是可以被调用的对象。那么函数体引用实际函数对象的最简单方法是什么?

thiscan be used to reference the containing object that a function (or more specifically, a method) is called from. But I believe thisnever refers to the actual function object itself.

this可用于引用从中调用函数(或更具体地说,方法)的包含对象。但我相信this永远不会指代实际的函数对象本身。

Obviously, bind, call, or applycould be used to change the value of thisfor the function. Or bindcould be used to create a version of the function that is always given a reference to itself as its first parameter.

显然,bindcall、 或apply可用于更改this函数的值。或者bind可用于创建一个函数版本,该版本始终将自身作为其第一个参数的引用。

But is there any simpler way? I suspect not, but I could be wrong.

但是有没有更简单的方法呢?我怀疑不是,但我可能是错的。

回答by Vivin Paliath

I cannot think of a case where a named function-expression cannot substitute for an anonymous function-expression. So I would suggest naming the function if you are going to call it from within itself (i.e., if you are going to use recursion):

我想不出命名函数表达式不能替代匿名函数表达式的情况。因此,如果您要从其内部调用它(即,如果您要使用递归),我建议命名该函数:

function myFunc(someArg) {
    ...
    ...
    myFunc(someNewArg);
}

This works even if it is a reference:

即使它是参考,这也有效:

var myFunc = function(someArg) {
    ...
}

You can even use a recursive IIFE (immediately-invoked function expression) if you don't want to pollute the namespace:

如果您不想污染命名空间,您甚至可以使用递归 IIFE(立即调用的函数表达式):

(function myFunc(arg) {
    ...
    myFunc(someOtherArg);
})(0); //some initial value

Furthermore, doing something like this:

此外,做这样的事情:

someOtherFunction(function myFunc(arg) {
    ...
    myFunc(otherArg);
});

Also works and won't pollute the namespace.

也可以工作并且不会污染命名空间。

回答by JayKuri

This is actually a frustration of mine, because you used to be able to use arguments.callee which would get you a reference to the function. As someone else mentioned, this is no longer possible.

这实际上是我的一个挫折,因为您曾经能够使用 arguments.callee 来获取对函数的引用。正如其他人提到的,这不再可能。

There is a pattern emerging for this... and that is to name the function yourself as well as assign it. It looks like this:

为此出现了一种模式……那就是自己命名函数并分配它。它看起来像这样:

my_obj.myfunc = function foo(arg1, arg2) {
     // do stuff
     foo.call(this, new_arg1, new_arg2);
}

This way you can reference the named function and go about your business. Note that you do have to use the .callsyntax if you want to call it as a method (so that thishas meaning) but apart from that, it's pretty straightforward.

通过这种方式,您可以引用命名函数并开展您的业务。请注意,.call如果要将其作为方法调用(这样this才有意义),则必须使用语法,但除此之外,它非常简单。

Another option is to do a truly functional approach, where you pass the object to be operated on to a function:

另一种选择是采用真正的函数式方法,将要操作的对象传递给函数:

function foo(obj, arg1, arg2) {
    // do stuff
    // call recursively:
    foo(obj, new_arg1, new_arg2);
}

// assign as method:
my_obj.foo = function(arg1, arg2) { 
     foo(this, arg1, arg2);
}

It could be argued that this is better and more flexible. I think it's a matter of taste, really.

可以说这是更好,更灵活。我认为这是一个品味问题,真的。

回答by Brennan

arguments.calleeinside of a function will be a reference to the function itself, but it's not exactly good form. You should name the function, then you can just use the name inside of the function

arguments.callee函数内部将是对函数本身的引用,但这不是完全好的形式。您应该命名函数,然后您可以在函数内部使用名称

回答by Rocket Hazmat

I would give your functions a name, then use that to reference them. If you have a declared function or a function variable, then it already has a name.

我会给你的函数一个名字,然后用它来引用它们。如果你有一个声明的函数或函数变量,那么它已经有了一个名字。

function test1(){
    // test1();
}

var test2 = function(){
    // test2();
};

If you have an anonymous function, you can actually give it a name. That name will onlyexist inside the function.

如果你有一个匿名函数,你实际上可以给它一个名字。该名称仅存在于函数内部。

someFunc(function test3(){
    // test3();
});
// test3 will be undefined here

回答by the.reversengineer

You can, but since the function is anonymous, a dummy way to identify it shall be adopted. You can learn a lot on how to do it by simply looking at this beautiful article: Anonymous Recursion in JavaScript

可以,但由于该函数是匿名的,因此应采用一种虚拟方式来识别它。只需查看这篇漂亮的文章:JavaScript 中的匿名递归,您就可以学到很多关于如何做到这一点的知识