Javascript:返回带有预定义参数的函数

时间:2009-03-10 16:45:44

标签: javascript function

我有一个像

这样的功能
function a (p1, p2) { /* ... */ }

并且在某些范围内想要得到这样的东西:

function b (/* no params! */) { return a (my1, my2) }

其中my1和my2在此范围内以某种方式定义。所以我应该得到一个无参数函数b,当调用时调用带有固定参数my1和my2的函数。现在,问题是,为什么这不对,哪个是:)

UPD:好的,我在这些参数中有一些回调,现在发现了,如何处理它们。我错过的是两次应用该技术。谢谢。

7 个答案:

答案 0 :(得分:17)

只需创建一个返回新函数b的函数:

function getB(my1, my2) {
  return function() {
    a(my1, my2);
  }
}

并像这样使用它:

var b = getB(my1, my2);

答案 1 :(得分:2)

编写一个带my1和my2的函数并创建函数b:

function make_b(my1, my2){
   return function b(){ return a(my1, my2);};
}

答案 2 :(得分:1)

为什么这不对?你收到错误了吗?我尝试根据你的描述和我的工作重现一个工作样本,所以也许你可以发布一个更详细的样本:

<script>

function a(p1, p2)
{
 return 'hello ' + p1 + ' and ' + p2;
}
function b(my1,my2)
{
 return function()
        {
          return a(my1,my2);
        }
}

var wrapper=b();
alert(wrapper());
</script>

修改

根据你对另一个答案的评论,我更新了我的样本,以展示你如何包装一个函数。

编辑2

好的,所以我用变量替换了它们; - )

答案 3 :(得分:1)

我不确定我是否理解正确,但你可以看一个名为currying的概念。可以在Javascript中调整函数,以便您可以获得具有预设的部分或全部参数的其他函数。

您可以查看实施here

如果您使用的是原型,则可以通过这种方式获得功能。

var b = a.curry(arg1, arg2);

现在调用b()与调用a(arg1, arg2)

相同

答案 4 :(得分:0)

将值放在数组(或JSON)中并返回数组。

function a (p1,p2) { 
   var my = []
   my[0] = p1
   my[1] = p2
   return my
}

function b () {
    return a(my1,nmy2)
}

也许我错过了你的例子中的观点,我不知道。

答案 5 :(得分:0)

似乎有三个部分:

定义:

  function a(M, N) {
    return M + N;
  }

定义b:

  var X = 10;
  var Y = 25;
  var b = function() {
   return a(X, Y);
}

使用b:

  var thirtyFive = b(); // thirtyFive = 35

答案 6 :(得分:0)

此示例使用onclick事件处理程序的分配 在页面加载期间演示如何创建函数 包含嵌入式引用然后本地的引用 设置功能中的值。

<html>
<head>
<title>Scope passing Test</title>
<script type="text/javascript">
// Your target function
function a(p1,p2)   {   alert("p1="+p1+ " p2="+p2); }


function yourSetupFunction()
    {
// Declare some local variables that your "a()" function cannot see to test.
var my1 ="Look Ma"  ;
var my2 ="No hands" ;

//  Snag a reference to the <a id="testA"></a> element  
var oAelement=document.getElementById("testA");

oAelement.addEventListener( "click"     ,
                (function(scopePass_My1,scopePass_My2)
                        {
                        return  function()
                            {
                            a(scopePass_My1,scopePass_My2)
                            }
                })(my1,my2) ,true);
    }
</script>
</head>
<body onload="yourSetupFunction()">
<a id="testA" href="#" onclick="return false;">Click to Test</a>
</body>
</html>

实际的魔法就是几行

(function(scopePass_My1,scopePass_My2)
            {
            return  function()
            {
                a(scopePass_My1,scopePass_My2)
            }
    })(my1,my2)

第一组parens导致内容被评估为函数引用。

第二组parens ...(my1,my2)...导致调用函数引用 返回另一个函数引用,可以看到传入的参数 ... scopePass_My1,scopePass_My2 ...并且能够将这些传递给你的目标函数a(p1,p2)

希望有所帮助。