在JavaScript中,函数只是可以调用的对象。那么函数体引用实际函数对象的最简单方法是什么?
this
可用于引用调用函数(或更具体地,方法)的包含对象。但我相信this
从不引用实际的函数对象本身。
显然,bind
,call
或apply
可用于更改该函数的this
值。或者bind
可用于创建函数的版本,该函数始终被赋予对自身的引用作为其第一个参数。
但是有更简单的方法吗?我怀疑不是,但我可能是错的。
答案 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