javascript - 一个没有参数的函数怎么会突然在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怎么突然带参数了,去哪了?
解决方案
让我知道我是否在这里不正常,但您似乎对如何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(...)
domain
range
this
.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);
推荐阅读
- pandas - 熊猫中的列扩大
- postgresql - postgresql:如何更新 JSONB 以在嵌套数组中添加新键
- jupyter-notebook - 如何将远程 Jupyter 笔记本与 PyCharm 社区版连接
- html - HTML中名称属性的用途是什么?
- docker - RabbitMQ,Kubernetes:队列中的消息在容器重新启动之间没有得到持久化,即使在添加卷之后也是如此
- javascript - 从字符串运行 HTML 和 JavaScript
- reactjs - 更改状态以使按钮从反应 js 中的禁用位置启用
- cron - Puppeteer 从终端工作但从 crontab 失败
- python-3.x - 在 Pandas 中读取 csv 文件
- javascript - 如何跟踪 pwa 安装的数量