2017-02-02 32 views
2

在有一點看看source coded3-drag的JavaScript(ES6)模塊的,我注意到有一個名爲constant.js其全部內容是:d3-drag庫中的`constant.js`的目的是什麼?

export default function(x) { 
    return function() { 
    return x; 
    }; 
} 

這在drag.js進口:

import constant from "./constant"; 

,然後使用(示出一個三類似實例):

drag.container = function(_) { 
    return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; 
    }; 

也許我只是不完全讚賞JavaScript的所有回調榮耀,但我不太明白constant.js模塊的用途。有人能夠對這裏發生的事情有所瞭解嗎?

回答

3

好了,讓我們一步步通過它

export default function(x) { 
    return function() { 
    return x; 
    }; 
} 

是會返回一個函數導致參數第一,例如功能

var fn = constant(4); 
fn() === 4; 

現在讓我們來看看

drag.container = function(_) { 
    return arguments.length 
    ? (container = typeof _ === "function" ? _ : constant(_), drag) 
    : container; 
}; 

注意,這個使用可變container此處未聲明的,存在於外部範圍。有兩個部分回事,一個是結果取決於使用模式,和其他依賴於通過型式所以讓我們把它分解了更多:

var container; 

drag.container = function(_) { 
    if (arguments.length > 0) { 
    if (typeof _ === "function") { 
     container = _; 
    } else { 
     container = constant(_); 
    } 
    return drag; 
    } else { 
    return container; 
    } 
}; 
  • .container()被稱爲無參數,返回container變量的當前值。
  • .container(foo)被調用時,如果foo是一個函數,該函數成爲container值,並且,如果它被不帶功能,constant用於創建一個返回非函數值foo的功能。

所以constanttypeof結合意味着container被保證始終是返回一個值的函數。