Javascript 函数返回值,而不使用给定参数替换变量

Javascript 函数返回值,而不使用给定参数替换变量,javascript,anonymous-function,currying,lambda-calculus,Javascript,Anonymous Function,Currying,Lambda Calculus,关于我用愚蠢的方式表达这个问题,这里有一些解释:我正在用javascript进行lambda演算的实验,我遇到了一些小困难。(你不必知道任何关于lambda微积分的知识来帮助我) 我有这个功能(顺便说一句,教堂数字1): 行为与预期一致,并给出与上述完全相同的结果 alert(num1(num1)) 表现出人意料,并给出: function (x) { return c(x); } 为什么javascript不能用函数num1替换“c”?但是 alert(num1(num1)(num

关于我用愚蠢的方式表达这个问题,这里有一些解释:我正在用javascript进行lambda演算的实验,我遇到了一些小困难。(你不必知道任何关于lambda微积分的知识来帮助我)

我有这个功能(顺便说一句,教堂数字1):

行为与预期一致,并给出与上述完全相同的结果

alert(num1(num1))
表现出人意料,并给出:

function (x) {
    return c(x);
}
为什么javascript不能用函数num1替换“c”?但是

alert(num1(num1)(num1))
给出:

function (x) {
    return c(x);
}
显示了第一个c实际上被函数替换了,就像它应该的那样。 如果“c”不被替换,则会发生以下情况:

(num1(num1)(num1))=

(function (x) {return c(x);}(num1=

c(function num1(c) {
    return function(x){
        return c(x);
    }
})
总之,代码正在做它应该做的事情,但是它没有输出替换了“c”的函数。我能做什么?稍后,我将介绍更多函数,然后我将无法区分
num1(asd)
num1(jkl)
,因为“c”不会被替换

非常感谢你的帮助


有人问你为什么不试试这个:

function num1(c) {
   function rv(x){
    return c(x);
  }
   rv.showBinding = function() {
     return c;
   }

   return rv;

}
然后:


看起来你正在努力掌握Y组合运算,我知道Y组合运算及其工作原理(但不知道为什么),我可以在纸上使用它。我还不知道我到底想用js做什么,但这个例子只是对我的实际问题的简化:S-和K-组合子有着同样愚蠢的行为。它会告诉你如何在你的问题中格式化代码。你的意思是记录函数会显示“错误”的源代码吗?这是意料之中的——JavaScript不会更改您的源代码。事实上,源代码并没有定义执行的行为。@someonelse:或者,您可以使用调试器。在
返回c(x)上放置断点行,执行
num1(num1)
并计算
c
,以查看
c
指的是
num1
function num1(c) {
   function rv(x){
    return c(x);
  }
   rv.showBinding = function() {
     return c;
   }

   return rv;

}
alert(num1);
alert(num1(num1).showBinding());