JavaScript函数可以自行返回吗?

fba*_*bas 26 javascript function self

我可以编写一个返回iteself的函数吗?

我正在阅读关于闭包的一些描述 - 参见例6 - 函数返回一个函数,所以你可以调用func()();有效的JavaScript.

所以我想知道一个函数可以以这样的方式返回自己,你可以无限期地将它链接到它自己:

func(arg)(other_arg)()(blah);
Run Code Online (Sandbox Code Playgroud)

使用argumentsobject,callee还是caller?

Fla*_*ino 32

有2-3种方式.正如你所说,一个是使用arguments.callee.如果你正在处理一个匿名函数,而这个函数没有存储在某个地方(你知道)变量,那么这可能是唯一的方法:

(function() {
    return arguments.callee;
})()()()().... ;
Run Code Online (Sandbox Code Playgroud)

第二是使用函数的名称

function namedFunc() {
    return namedFunc;
}
namedFunc()()()().... ;
Run Code Online (Sandbox Code Playgroud)

而最后一个是使用分配给一个变量的匿名函数,但你必须知道的变量,所以在这种情况下,我看不出有任何理由,你为什么不能随便给一个函数名,并使用上述方法

var storedFunc = function() {
    return storedFunc;
};
storedFunc()()()().... ;
Run Code Online (Sandbox Code Playgroud)

它们在功能上都是相同的,但却callee是最简单的.

编辑:我同意SLaks; 我不能推荐它

  • 值得注意的是`arguments.callee`在ES5 Strict中引发错误http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ (11认同)
  • @Flambino,你是对的.方法1:通常应该完全避免,因为arguments.callee已被弃用.请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee方法2:这是在JS中执行递归函数调用的最佳方法,因为函数不是匿名,它的名字将显示在堆栈跟踪中. (2认同)

SLa*_*aks 10

是.
只是return arguments.callee;


但是,这可能会导致代码混乱; 我不推荐它.

  • 我只是命名函数,而不是使用`arguments.callee`有两个原因:1.函数通常由实现优化,如果你不使用`arguments`对象,它通常不会被创建(执行上下文)将被更快地初始化) - 当然,如果函数使用`eval`,它通常无法优化 - .2.参数`对象在ES5严格模式上有变化,并且不允许`arguments.callee`属性(同样也是为了优化和安全性问题),所以基本上要编写*面向未来的*代码,我建议只需命名功能.:) (6认同)
  • 这两个都是不允许的,而`caller` AFAIR实际上从来都不是规范的一部分,但它得到了许多实现的支持,这就是为什么在ES5上,对于严格的函数,`caller`和`callee`都分配给[thrower function] (http://es5.github.com/#x13.2.3),参见[10.6 Arguments Object]中的*Step 14*(http://es5.github.com/#x10.6) (3认同)
  • 此外,请检查这个简单的 [基准测试](http://jsperf.com/arguments-callee-vs-fn-name) 以查看 `arguments` 对象创建如何影响性能。顺便说一句,`caller` 属性真的很危险,它允许在某些实现中“破坏”闭包,例如在 Spidermonkey 中的某些技术 [像这样](http://jsfiddle.net/cmsalvado/87C7c/) 允许 *泄漏* 私有范围的函数。 (2认同)

ata*_*aru 6

你可以按照以下方式做你想做的事:

// Do definition and execution at the same time.
var someFunction = (function someFunction() {

    // do stuff
    return someFunction
 })();

 console.log(someFunction)
Run Code Online (Sandbox Code Playgroud)

JavaScript严格模式不支持arguments.callee.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode