Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在JavaScript中使用Function.caller的共识是什么?_Javascript_Performance - Fatal编程技术网

什么';在JavaScript中使用Function.caller的共识是什么?

什么';在JavaScript中使用Function.caller的共识是什么?,javascript,performance,Javascript,Performance,不久前,我读到不应该在函数内部使用,因为它使函数不可内联。为了测试这个断言,我编写了以下基准测试: 结果证明,使用Function.caller确实会使函数执行速度比正常情况慢: 在歌剧中,它慢了16% 在Chrome中,速度要慢80% 在Firefox中,速度要慢100% 因此我的问题是:在JavaScript中使用Function.caller有什么共同点?少用可以吗?应该完全避免吗?据我所知,在严格模式下,不允许使用caller/callee/etc动态检查执行堆栈,因此您可以将此视为一

不久前,我读到不应该在函数内部使用,因为它使函数不可内联。为了测试这个断言,我编写了以下基准测试:

结果证明,使用
Function.caller
确实会使函数执行速度比正常情况慢:

  • 在歌剧中,它慢了16%
  • 在Chrome中,速度要慢80%
  • 在Firefox中,速度要慢100%

  • 因此我的问题是:在JavaScript中使用
    Function.caller
    有什么共同点?少用可以吗?应该完全避免吗?

    据我所知,在
    严格
    模式下,不允许使用caller/callee/etc动态检查执行堆栈,因此您可以将此视为一种共识,以尽可能避免使用此功能


    不管怎样,你为什么要首先使用Function.caller呢?它使您的代码依赖于通常不重要的东西(调用堆栈),数据以隐式方式传递,而不是通过显式参数传递。我所见过的这类功能的唯一真正用途是打印堆栈跟踪,在这种情况下,您通常可以支付性能成本,也可以通过调试器绕过它。

    如果性能是您唯一关心的问题,那么它可能很好。虽然比不引用调用方的速度慢很多,但我的机器每秒仍然可以执行160万次

    “慢”可以是一个相对的术语。如果你只需要很少打电话给它,它就可以做到。大多数时候,它的速度非常快。我只是不想把它放在一个大循环中,在我游戏中的每一个动画帧上迭代


    然而,这个神奇的属性还有其他问题。正如@missingno所指出的,除了性能之外还有更多的问题。

    您的“正常功能”功能在任何意义上都不正常,它引用了另一个神奇的属性
    。name
    。。。固定基准:@Esailija这是我不知道的。谢谢。这不是重点,而是影响函数的内联性。它的效果不能这样看,因为这是一个使能优化,可以从根本上改变运行的代码,因为编译器可以一次看到更多,我不想在任何生产代码中使用它。目前我只是想尝试一下,看看我能做些什么。@AaditMShah:如果你只是想玩,那就去做你想做的吧。这就是说,不在严格模式下工作是一个很大的限制,我想说,像这样检查调用堆栈会破坏很多封装,通常是“邪恶的”事情的另一面。这是我编造出来的:这取决于以下要点:@AaditMShah这很好,尽管其他可接受的解决方案在没有性能损失的情况下可用,但在“API”上确实是最好的side:PNot only在严格模式下是不允许的,除了
    参数
    对象之外的所有对象都已弃用,并将在未来的javascript版本中删除。因此,共识是不要使用它。人们的共识是,它们实际上并不存在。