功能自我参考

时间:2014-10-09 16:51:51

标签: javascript

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

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

显然,bindcallapply可用于更改该函数的this值。或者bind可用于创建函数的版本,该函数始终被赋予对自身的引用作为其第一个参数。

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

5 个答案:

答案 0 :(得分:12)

我想不出一个命名的函数表达式不能替代匿名函数表达式的情况。所以我建议命名函数,如果你打算从内部调用它(即,如果你打算使用递归):

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

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

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

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

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

此外,做这样的事情:

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

同样有效并且不会污染命名空间。

答案 1 :(得分:4)

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

有一种模式正在出现......那就是自己命名这个函数并分配它。它看起来像这样:

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

通过这种方式,您可以引用指定的功能并开展业务。请注意,如果要将其称为方法(.call具有意义),则必须使用this语法,但除此之外,它非常简单。

另一种选择是做一个真正的功能性方法,将要操作的对象传递给函数:

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);
}

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

答案 2 :(得分:2)

函数内部的

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

答案 3 :(得分:2)

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

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

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

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

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

答案 4 :(得分:-1)

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

相关问题