【问题标题】:Function call order with the same function as arguments. Javascript函数调用顺序与参数相同的函数。 Javascript
【发布时间】:2018-07-18 10:52:37
【问题描述】:

我有以下代码:

function f() {

    //...do stuff with arguments 
    //and return something...

}

f(root,
    f(child1),
    f(child2,
        f(subchild1),
        .... 
    ),
);

我想知道什么时候调用'f'的根级别,所以我引入一个标志作为参数:

f(root, '-r',
  f(child1),
  f(child2),
  //...
)

我的问题是:有没有办法知道什么时候在顶层“f(root,...)”上调用了“f”而不添加额外的参数?

【问题讨论】:

  • 你可以试试相反的方法,F()()()()Here 就是一个例子

标签: javascript function


【解决方案1】:

不,在f 中的代码中,您无法判断它的返回值没有用于构建参数列表以供后续调用f。 (或者实际上,它的返回值是否被用于任何特定事物,或者根本没有。)这不是一个不合理的问题,但 f 无法获得该信息。

【讨论】:

    【解决方案2】:

    您实际上可以使用f.caller 并检查它是否为null;但由于尾调用优化,在“严格模式”下被禁止:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

    此外,对于您的代码类型,这将是不可靠的:理想情况下,您不应该需要在 rootchildren 之间进行这种类型的分支(参见例如任何树结构实现,如 DOM 或 hyper-脚本`)。

    一般来说,如果您有一个f 函数而不是返回一个树节点,那么在哪个级别调用应该无关紧要。例如:

    let subchild = f(subchild1)
    
    f(root,
        f(child1),
        f(child2, subchild),
            .... 
        ),
    );
    

    这应该返回与您的代码相同的结构,但如果您检查调用者,则不会,因为f(subchild1) 将与f(root) 相同。

    【讨论】:

    • "...但是由于尾调用优化,它在“严格模式”下被禁止..." 更一般地说,在严格模式下被禁止,因为这是一个非常糟糕的主意将调用函数分配给被调用函数的属性,尤其是因为虽然 大多数(绝大多数)JavaScript 环境只有一个线程访问给定领域,而不是 all做,也不是在未来关闭新的多线程环境规范目标。 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2022-12-05
    • 2016-07-15
    相关资源
    最近更新 更多