2011-01-15 3 views
1

In dem unten, woher kommt b? Ich sehe nicht, dass es weitergegeben wird, also wie könnte es zurückgegeben werden?Makeadder Beispiel von Ben Alman

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

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

Ausführlichere Auszug:

// 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

Sie vielleicht einen Blick auf, was currying nehmen wollen, ist: http: //en.wikipedia. org/wiki/Currying – Agos

Antwort

2

Vorlagentyp hat bereits eine Erklärung geliefert, ich zeige Ihnen eine kleine Aufschlüsselung im Code.

Unser Setup:

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

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

ist jetzt unter der folgenden aussehen lassen:

var add1 = lockInFirstArg(add, 1); 

Und brechen sie:

// 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 
    }; 
} 

Also am Ende er var add1 = assigment ist gleich :

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

Was hier ins Spiel kommt, ist, dass Funktionen sind beiden Objekte erste Klasse und closures, keine Magie einfach nur JavaScript :)

+0

Ohhhhhhhh. Es dauerte eine Minute, aber ich sehe jetzt. Danke, eine Milliarde, ich glaube nicht, ich hätte schlafen können, ohne das zu verstehen :) – Matrym

2

Der Sinn dieser Code ist, dass b ist der Parameter einer neuen Funktion erzeugt durch lockInFirstArg aufrufen. Die Intuition ist, dass Sie lockInFirstArg rufen, die in einer Funktion fn übergeben, die zwei Argumente und irgendeinen anderen Wert a nimmt. Es erzeugt dann eine Funktion, die, wenn sie einen Wert hat (nennen wir es b), die Funktion fn auf a und b anwendet. Dies ist vergleichbar mit der Funktion fn, die den Parameter a an Ort und Stelle sichert und dann die resultierende Funktion zurückgibt.

Übrigens wird dieser Begriff manchmal "currying" genannt. Dies hat eine technische Bedeutung, aber es ist hier ziemlich nah an der Bedeutung dieses Codes.

+0

Ich habe keinen Zweifel, Ihre Antwort ist richtig, aber ich kann nicht meinen Kopf darum herum, warum es funktioniert. Würde es Ihnen etwas ausmachen, weiter zu arbeiten, vielleicht anhand eines Beispiels? Der Teil, an dem ich mich gerade festhalte, ist, wie man A var ohne Argumente erstellt, und dann mit einem arg aufrufen, um arg in die Funktion zu bringen. Vielleicht vermisse ich etwas Magie hinter wiederkehrenden Funktionen? – Matrym