首页 > 解决方案 > 一个没有参数的函数怎么会突然在javascript中取参数?

问题描述

我来自交流背景,所以我习惯于对语法更加迂腐,但我很难理解这里发生的事情。D3.js 有一个名为 scaleLinear 的函数。他们举例说明了如何使用它。

var myScale = d3.scaleLinear();

myScale
  .domain([0, 100])
  .range([0, 800]);

myScale(0);    // returns 0
myScale(50);   // returns 400
myScale(100);  // returns 800

myscale怎么突然带参数了,去哪了?

标签: javascriptfunctiond3.jsparameters

解决方案


让我知道我是否在这里不正常,但您似乎对如何myScale将其用作函数myScale(0)以及myScale.domain(...).

在 JS 中,函数只是可以通过()语法调用的对象。有时这样做很方便:

// contrived example
function talk(message) { console.log(message); }
talk.yell = function(message) { console.log(message.toUpperCase()) }

现在如果你talk("foo"); // "foo",如果你talk.yell("foo"); // "FOO"

因此,在您的情况下,该函数返回了一个scaleLinear函数(它)myScale.domain(...).range(...)domainrangethis.domain().range()

这种模式显然有更多有用的案例。例如,模块通常会导出一个函数,然后包含其他帮助器或类作为该函数的成员。requestjs使用此模式提供基本request(...)功能及其其他功能。

这也是静态类方法在 JS 中的工作方式。

function Point(x, y) { this.x = x; this.y = y; }
Point.fromPolar = function(r, t) { . . . }

var point = new Point(0, 1);
var samePoint = Point.fromPolar(1, 0.5 * Math.PI);

所以让我们举一个例子来说明你的具体例子是如何工作的。

const d3 = {};
d3.scaleLinear = function() {
    const result = function(num) { /* logic here to handle myScale(n) */ }
    result.domain = function(...) { ...; return result; }
    result.range = function(...) { ...; return result; }
}

scaleLinear您可以看到, 的参数和从它返回的结果函数之间不需要任何关系。

此外,在 js 中关于接受参数的概念实际上并没有那么严格。JS 不检查调用,因此所有参数始终是可选的,除非在函数本身中强制执行。

以下运行良好:

function doSomething() {}; doSomething(1); doSomething(1, 2, 3);
function doSomething2(n) {}; doSomething2(); doSomething2(1, 2, 3);
function doSomething3(...nums) {}; doSomething3(); doSomething3(1,2,3);

推荐阅读