2017-05-10 17 views
8

Po prostu natknąłem się na linię kodu w projekcie, w którym aktualnie pracuję. Czuję, że jestem przyzwoitym w JavaScript, ale szczerze mówiąc, nie mam pojęcia, co robi następująca linia kodu:Co może zrobić ta linia kodu JavaScript?

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

Czy ktoś z was guru JavaScript prawdopodobnie rzuci trochę światła na to?

buildDateParams wydaje się budować tablicę wartości. Przez wzgląd na kompletność, oto funkcja:

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

Wygląda na to, że funkcja ta zwraca tablicę liczb, a nie ciągi. – Pointy

+0

Nie badałem dalej tej funkcji, możesz łatwo mieć rację. Dostosuje go do "wartości" zamiast "ciągów znaków". – connexo

Odpowiedz

5

To sort-skomplikowanej wersji

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

z wyjątkiem jednego, który działa; chodzi o to, że chce związać konstruktor Date z zestawem parametrów generowanych przez tę funkcję buildDateParams().

ze składnią ES2015 spread, że to działa napisać

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

To właśnie stworzenie funkcji, która zwraca instancję Date według niektórych wstępnie ustawionych parametrów.

Ponadto, z powodu tego zabłąkanego przecinka w inicjatorze macierzy [null,], może to powodować problemy w IE (chociaż nowoczesna IE z .bind() może nie interpretować tej tablicy jako posiadającej dwa elementy).

+0

"z wyjątkiem jednego, który działa" - czy to oznacza, że ​​twoja wersja bardziej zwięzła nie działa? W przeciwieństwie do kodu znalezionego w projekcie sugerujesz wywołanie binda z dwoma parametrami 'null' i tablicą zwróconą przez tę funkcję, podczas gdy w moim przykładzie kodu jest to tylko jeden argument, a tablica zawiera' null' jako jej pierwszy element. – connexo

+0

@connexo tak przepraszam, moja początkowa odpowiedź pominęła subtelność wartości zwracanej z tej funkcji będącej tablicą do wykorzystania jako parametry; składnia "..." poradziłaby sobie z tym. Uznaję pół filiżanki kawy za pomoc w zrozumieniu, że :) – Pointy

+0

@connexo należy również pamiętać, że opublikowana wersja mogła użyć 'Date.bind.apply' zamiast' Function.prototype.bind.apply' – Pointy

Powiązane problemy