2017-05-10 142 views
8

我只是在一個項目中,我目前工作中的代碼行迷迷糊糊,我覺得我是在體面的Javascript,但說實話,我不知道是什麼的下面一行代碼實際上做:這行代碼可能做什麼?

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

可以在你這樣的人的Javascript大師可能一些線索呢?

buildDateParams似乎建立值的數組。爲了完整起見,這裏的功能:

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

在我看來這樣的函數返回數字,而不是字符串數組。 – Pointy

+0

我還沒有進一步調查該功能,你可以很容易地說得對。將它調整爲「值」而不是「字符串」。 – connexo

回答

5

這是排序的

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

複雜的版本,除了一個工程;它的想法是它想要將Date構造函數綁定到由buildDateParams()函數生成的一組參數。

隨着ES2015傳播語法,它會努力寫

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

它只是創造,根據一些事先安排好的參數,返回日期實例的功能。

此外,由於[null,]數組初始值設定項中的逗號逗號,它可能在IE中有問題(儘管現代IE與.bind()可能不會將該數組解釋爲具有兩個元素)。

+0

「除了有效」 - 這是否意味着您的更簡潔的版本不起作用?與此相反的代碼,我在你的建議調用bind有兩個參數'null'和該函數返回的數組,而我的代碼示例中,這只是一個說法,和數組包含'null'作爲其第一個元素的項目中找到。 – connexo

+0

@connexo對不起,我的初始響應錯過了來自該函數的返回值的細微之處,它是一個用作參數的數組; '...'語法可以處理這個問題。我給信貸的咖啡幫助我意識到:) – Pointy

+0

@connexo半杯也注意到,您發佈的版本,也可以使用'Date.bind.apply'代替'Function.prototype.bind.apply' – Pointy