功能自我参考

Lev*_*sey 8 javascript

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

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

显然,bind,call,或者apply可以用来改变的值this的功能.或者bind可以用于创建函数的版本,该函数总是被赋予对自身的引用作为其第一个参数.

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

Viv*_*ath 12

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

function myFunc(someArg) {
    ...
    ...
    myFunc(someNewArg);
}
Run Code Online (Sandbox Code Playgroud)

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

var myFunc = function(someArg) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

(function myFunc(arg) {
    ...
    myFunc(someOtherArg);
})(0); //some initial value
Run Code Online (Sandbox Code Playgroud)

此外,做这样的事情:

someOtherFunction(function myFunc(arg) {
    ...
    myFunc(otherArg);
});
Run Code Online (Sandbox Code Playgroud)

也可以工作,不会污染命名空间.


Jay*_*uri 5

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

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

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

通过这种方式,您可以引用命名函数并开展您的业务。请注意,.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);
}
Run Code Online (Sandbox Code Playgroud)

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