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) !&#34));它首先运行bar(" world!"),然后给出foo()bar()的结果。
我以为我可以检查bar()的调用堆栈,因为我认为foo()正在调用它。但它被foo()调用之前调用foo()的相同函数调用。
我开始觉得这是不可能的。
修改 所以很明显,大多数人对我为什么要这样做感到有点困惑。
我使自己成为快速构建HTML元素的功能。 我可以调用该函数,只需传入我希望它们附加到的父元素和一堆标记名称,然后创建这些标记并将它们附加到该父元素
obj = c(tableElement,"td","td","td")
这将创建3个单元格并将它们附加到我的表格中。但不会退货。这样:
obj = undefined
但是,如果我将原始代码更改为:
,那就好了obj = c(tableElement,"td","td",true,"td")
然后它会做同样的事情。而是将第二个单元格传递给obj,以便我以后可以轻松再次使用该单元格。
当我想使用Javascript来构建一堆我之后不需要操作的东西时,它会派上用场。
在我开始添加嵌套元素的能力之前,一切正常。 EX:
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()函数中需要TRUE参数。它们是不必要的,因为它们无论如何都是必需的。如果我有某种方式知道它是嵌套的。那么我可以忽略TRUE参数,我的代码会更加简洁。
我也希望能够将其中一个嵌套单元格返回到obj变量。
我认为我唯一的选择就是创建第二个功能,它可以用作嵌入式元素创建者。
答案 0 :(得分:1)
你要求的东西没有多大意义。函数式编程背后的关键原则是函数的执行仅基于函数执行期间提供的参数。如果您想区分这两个函数,您需要提供一个额外的参数来通知您函数应该调用它的哪个部分。在你的情况下,我会想象这样的事情:
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文档通常是个坏主意。请考虑使用http://handlebarsjs.com/并节省大量时间。
答案 1 :(得分:0)
要弄清楚函数调用的上下文,可以使用Function.caller(取代arguments.caller
)。
function bar () {
console.log(bar.caller);
}
但是,由于两个函数调用都是使用相同级别的代码进行的,因此它们将返回相同的结果(如果调用来自顶级代码,则返回null
。)
因此,你想要的是不可能的。另外,为什么你想要这样做?