Javascript 如何判断一个函数是否作为另一个函数的参数调用?

Javascript 如何判断一个函数是否作为另一个函数的参数调用?,javascript,Javascript,javascript大师!我意识到这个问题的标题可能有点混乱。但我不知道该怎么解释 让我举个例子: function foo(txt){ return "Hello " + txt); } function bar(txt){ if(/* bar is called as an argument */) return txt; if(/* bar is called normally */) return "Bar"; } foo(bar("world!")); /

javascript大师!我意识到这个问题的标题可能有点混乱。但我不知道该怎么解释

让我举个例子:

function foo(txt){
    return "Hello " + txt);
}
function bar(txt){
    if(/* bar is called as an argument */) return txt;
    if(/* bar is called normally */) return "Bar";
}

foo(bar("world!"));   //Returns "Hello World";
bar("world!");        //Returns "Bar";
我希望bar()在作为另一个函数的参数调用时与在自己的函数中调用时有所不同

我似乎找不到任何方法让bar()知道它是否是另一个函数中的参数,因为当浏览器运行foo(bar(“world!”)时;它首先运行bar(“world!”),然后将bar()的结果提供给foo()

我想我可以检查bar()的调用堆栈,因为我认为foo()正在调用它。但它是由调用foo()之前调用foo()的同一个函数调用的

我开始觉得这是不可能的

编辑: 所以很明显,大多数人对我为什么要这样做有点困惑

我正在使自己成为快速构建HTML元素的函数。 我可以调用该函数,只需传入我希望它们附加到的父元素和一组标记名,它就会创建这些标记并将它们附加到该父元素

obj = c(tableElement,"td","td","td")
这将创建3个单元格并将它们附加到我的表中。但不会归还任何东西。以便:

obj = undefined
但这没关系,因为如果我将原始代码更改为:

obj = c(tableElement,"td","td",true,"td")
然后它会做同样的事情。而是将第二个单元格传递给obj,以便稍后我可以轻松地再次使用该单元格

当我想用Javascript来构建一堆我以后不需要操作的东西时,它就派上了用场

在我开始添加嵌套元素的功能之前,一切都很好。例:

obj = c(tableElement,"tr",c("td",true,"td",true,"td",true),"tr",true)
实际上,这很好地实现了以下输出:

<table>
   <tr>
       <td></td>
       <td></td>
       <td></td>
   </tr>
   <tr></tr>
</table>

和obj=仅第二行元素

现在,我要用所有这些来完成的技巧。我不想在嵌套的c()函数中使用真参数。它们不是必需的,因为无论发生什么,它们都是必需的。如果我有办法知道它是嵌套的。然后我就可以忽略真正的参数,我的代码就会简洁得多

我还希望能够将其中一个嵌套单元格返回到obj变量


我认为我唯一的选择是创建第二个函数,该函数的工作方式与用作嵌入式元素创建者略有不同。

要了解函数调用的上下文,可以使用(它将取代
参数。调用者

但是,由于两个函数调用来自同一级别的代码,因此它们将返回相同的结果(如果调用来自顶级代码,则返回
null


因此,你想要的是不可能的。还有,你为什么要这么做?

你所要求的没有多大意义。函数编程背后的关键原则是函数的执行仅基于函数执行期间提供的参数。如果您想区分这两个函数,您需要提供一个额外的参数,通知您应该调用函数的哪个部分。在你的情况下,我会想象这样的情况:

function foo(txt){
    return "Hello " + txt);
}

function bar(argument,txt){
    if(argument) return txt;
    else return "Bar";
}

foo(bar(true,"world!"));   //Returns "Hello World";
bar(false,"world!");        //Returns "Bar";
我认为在你的特殊情况下,这可能会解决问题

更新:


我理解你的问题,但他们认为你试图解决问题的方式没有多大意义。我可以直接告诉您,您尝试引入的这个解决方案不会以任何合理的方式扩展。从JavaScript创建HTML文档通常不是一个好主意。请考虑使用并节省你自己的时间。

但是你没有传递函数作为一个参数,你调用函数并传递作为参数返回的字符串,那就是添加括号做什么,把函数作为一个你必须做的参数<代码> FO(bar);<代码>我不知道你为什么要这样做。我想我现在明白了,不,你不能这样做,函数
bar
不知道它被调用的方式与函数
foo
的调用方式有关。你为什么要这样做?为什么重要?听起来像个XY问题。你的实际目标是什么?
function foo(txt){
    return "Hello " + txt);
}

function bar(argument,txt){
    if(argument) return txt;
    else return "Bar";
}

foo(bar(true,"world!"));   //Returns "Hello World";
bar(false,"world!");        //Returns "Bar";