在下面,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
答案 0 :(得分:2)
此代码的要点是b
是通过调用lockInFirstArg
生成的新函数的参数。直觉是你调用lockInFirstArg
传递一个函数fn
,它接受两个参数和一些其他值a
。然后它产生一个函数,如果给定一些值(让我们称之为b
),则将函数fn
应用于a
和b
。这类似于获取函数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:)