2017-02-02 3 views
2

В с немного взгляда на source code для модуля d3-drag Javascript (ES6), я заметил, есть файл с именем constant.js, вся содержание:Какова цель `constant.js` в библиотеке d3-drag?

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.

Так constant в сочетании с typeof означает, что container гарантированно всегда быть функцией, которая возвращает значение.