来自Ben Alman的Makeadder例子

时间:2011-01-15 09:50:53

标签: javascript

在下面,b来自哪里?我没有看到它被传入,所以怎么可以返回?

function lockInFirstArg( fn, a ) {
  return function( b ) {
    return fn( a, b );
  };
}

链接:http://msdn.microsoft.com/en-us/scriptjunkie/gg575560

更完整的摘录:

// More-general functions.
 
function add( a, b ) {
  return a + b;
}
 
function multiply( a, b ) {
  return a * b;
}
 
// Relatively flexible more-specific function generator.
 
function lockInFirstArg( fn, a ) {
  return function( b ) {
    return fn( a, b );
  };
}
 
var add1 = lockInFirstArg( add, 1 );
add1( 2 );    // 3
add1( 3 );    // 4
add1( 10 );   // 11

2 个答案:

答案 0 :(得分:2)

此代码的要点是b是通过调用lockInFirstArg生成的新函数的参数。直觉是你调用lockInFirstArg传递一个函数fn,它接受​​两个参数和一些其他值a。然后它产生一个函数,如果给定一些值(让我们称之为b),则将函数fn应用于ab。这类似于获取函数fn,将参数a锁定到位,然后返回结果函数。

顺便说一句,这个词有时被称为“currying”。这有一个技术含义,但它非常接近这里代码的含义。

答案 1 :(得分:2)

templatetypedef已经提供了解释,我将向您展示代码中的细分。

我们的设置:

function add( a, b ) {
  return a + b;
}

function lockInFirstArg( fn, a ) {
  return function( b ) {
    return fn( a, b );
  };
}

现在让我们看看以下内容:

var add1 = lockInFirstArg( add, 1 );

并将其分解:

// passes in the function object and 1 as arguments
var add1 = lockInFirstArg(function add( a, b ) {
  return a + b;
}, 1 );

// the lockin function will look a bit like this
function lockInFirstArg( fn, a ) {
  // fn = function add
  // a = 1

  // returns a new function which calls fn aka add
  // this function is also a closure, that means it keeps access to the scope of
  // lockInFirstArg so it can still use the variable a, even after it was returned
  return function( b ) {
    return a + b; // inlined add
  };
}

所以最后他var add1 =分配等于:

//  is equal to this
var add1 = function( b ) {
    return 1 + b;
};

这里发挥的作用是函数既是一等对象又是closures,没有魔法只是简单的JavaScript:)

相关问题