2017-05-10 5 views
8

Ich bin gerade über eine Codezeile in einem Projekt gestolpert, in dem ich gerade arbeite. Ich fühle, dass ich in Javascript anständig bin, aber um ehrlich zu sein, habe ich keine Ahnung, was die folgende Codezeile tatsächlich macht:Was könnte diese Zeile von Javascript-Code möglicherweise tun?

var date = new (Function.prototype.bind.apply(Date, [null,].concat(buildDateParams(spec, base)))); 

Kann jemand von Ihnen Javascript-Gurus möglicherweise etwas Licht auf dieses werfen?

buildDateParams scheint ein Array von Werten zu erstellen. Der Vollständigkeit halber ist hier die Funktion:

function buildDateParams(spec, base) { 
    if (!spec.match(specRegExp)) { 
     throw new Error('Invalid spec string'); 
    } 
    var specParts = spec.toLowerCase().split(':'); 
    let params = []; 
    for (let fieldIndex in fields) { 
     let field = fields[fieldIndex]; 
     let specPart = (fieldIndex < specParts.length) 
      ? specParts[fieldIndex] 
      : '0'; 
     if (!specPart.length) { 
      specPart = 'b'; 
     } 
     let param = 0; 
     if (specPart.substr(0, 1) === 'b') { 
      param = base[field.getter](); 
      specPart = specPart.substr(1); 
     } 
     if (specPart.length) { 
      param += parseInt(specPart); 
     } 
     params.push(param); 
    } 
    return params; 
} 
+1

Es sieht für mich so aus, dass die Funktion ein Array von Zahlen zurückgibt, keine Strings. – Pointy

+0

Ich habe nicht weiter in diese Funktion untersucht, Sie könnten leicht recht haben. Passt es an "Werte" anstelle von "Strings" an. – connexo

Antwort

5

Es ist eine Art-eine komplizierte Version von

Date.bind(null, buildDateParams(spec, base)); 

mit einer Ausnahme, die funktioniert; Die Idee ist, dass der Date-Konstruktor an eine Reihe von Parametern gebunden werden soll, die von dieser buildDateParams()-Funktion generiert werden.

Mit der ES2015 Ausbreitung Syntax, würde es eine Funktion nur zu schreiben, arbeiten

Date.bind(null, ... buildDateParams(spec, base)); 

Es ist zu schaffen, die nach einigen vorher vereinbarten Parameter eine Date-Instanz zurückgibt.

Auch wegen der Streukomma in der [null,] Array Initialisierer, könnte es Probleme in IE haben (obwohl ein moderner IE mit .bind() dieses Array möglicherweise nicht als zwei Elemente zu interpretieren).

+0

"außer einem, das funktioniert" - bedeutet das tatsächlich, dass Ihre prägnantere Version nicht funktioniert? Im Gegensatz zu dem Code, den ich im Projekt gefunden habe, schlage ich vor, bind mit zwei Parametern 'null' und dem von dieser Funktion zurückgegebenen Array aufzurufen, während es in meinem Codebeispiel nur ein Argument und ein Array mit 'null' als erstem Element gibt. – connexo

+0

@connexo ja Entschuldigung meine erste Antwort verfehlte die Subtilität des Rückgabewerts von dieser Funktion, die ein Array ist, das als Parameter verwendet wird; Die '...' Syntax würde das handhaben. Ich schätze eine halbe Tasse Kaffee dafür, dass sie mir geholfen haben, das zu realisieren :) – Pointy

+0

@connexo beachte auch, dass die von dir gepostete Version 'Date.bind.apply' anstelle von' Function.prototype.bind.apply' verwendet haben könnte – Pointy

Verwandte Themen