在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)
也可以工作,不会污染命名空间.
这实际上是我的一个挫折,因为您曾经能够使用 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)
可以说这是更好,更灵活。我认为这是一个品味问题,真的。
| 归档时间: |
|
| 查看次数: |
12587 次 |
| 最近记录: |