试图理解javascript代码
trying to understand javascript code
我正试图通过弄脏双手来理解javascript代码。。我的背景主要是python和C++。
所以我在这里浏览这个代码
http://bl.ocks.org/mbostock/1021841
var force = d3.layout.force()
.nodes(nodes)
.links([])
.size([w, h])
.start();
我猜"."代表一种方法。。但指向哪个对象?我很难理解这个复杂的函数(方法??)
force.on("tick", function(e) {
// Push different nodes in different directions for clustering.
var k = 6 * e.alpha;
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
});
有人能用更简单的语言把它分解给我吗。感谢
此代码:
var force = d3.layout.force()
.nodes(nodes)
.links([])
.size([w, h])
.start();
应该与如果它是C++时读取的基本相同(除了var
关键字;在C++中,您必须为force
声明一个特定类型)。与C++一样,空白(大部分)是微不足道的。每个.
指示一个属性访问。(与C++不同,JavaScript对象不区分字段和方法;所有东西都是一个属性。如果它是函数属性,则可以在名称后面加括号来调用它,如果合适的话,括号里加函数参数。)因此,这里发生的是:
d3.layout
-访问d3
的layout
属性.force()
-调用作为d3.layout
属性的force
函数。在force
内部,d3.layout
将可用作关键字this
.nodes(nodes)
-调用nodes
函数,该函数是调用force()
返回的任何对象的属性(可能是d3.layout
,也可能是其他对象)- 等等
最后将CCD_ 18返回的值分配给CCD_。
关于第二段代码:
force.on("tick", function(e) {
// Push different nodes in different directions for clustering.
var k = 6 * e.alpha;
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
});
这里我们看到一个anonymous function
的例子(实际上是两个)。根据通常的JavaScript约定,force
的on
函数可能用于注册事件处理程序—在这种情况下用于CCD_ 22事件。事件处理程序是匿名函数:
function(e) {
// Push different nodes in different directions for clustering.
var k = 6 * e.alpha;
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
}
为了便于解释,我们将此函数称为"outer"。它需要一个参数,我猜这个参数是一个包含tick事件属性的对象。在outer的主体中,我们看到了另一个匿名函数:nodes.forEach
的参数。让我们将第二个匿名函数称为"inner"。这里的forEach
函数很可能是标准的forEach
迭代器函数,它是所有JavaScript数组的属性;它将一个函数作为参数,并依次调用数组中每个元素的函数,传递数组元素和元素索引。Inner实际上是闭包的一个例子:函数体引用变量k
,该变量被定义为outer的局部变量。
JavaScript在某些方面与C++相似,但在某些方面却有根本的不同。除非你知道相似之处从哪里开始,否则你的C++背景可能会让你在编码(和代码阅读)工作中误入歧途。我强烈推荐介绍性论文"重新介绍JavaScript"。它涵盖了该语言的所有主要功能,应该有助于澄清C++和JavaScript的相似之处和不同之处。
这:
var force = d3.layout.force()
.nodes(nodes)
.links([])
.size([w, h])
.start();
与此相同:
var force = d3.layout.force().nodes(nodes).links([]).size([w, h]).start();
变量force
的值将是链中最后一个方法(在本例中为.start()
)的返回值。
这称为方法链接。每一个连续的函数都被调用为一个方法,该方法对其之前函数的返回值进行调用
因此,方法.nodes(nodes)
对从d3.layout.force()
返回的对象进行调用,方法.links([])
对从.nodes(nodes)
返回的对象调用,依此类推
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- JavaScript代码问题:我正在将对象转换为数组
- Javascript阻止其他Javascript代码
- JavaScript代码未正确检查ajax请求
- 如何调试Javascript代码或函数
- 为什么我在这个javaScript代码中使用NaN
- 将javascript代码转换为jquery代码时出错
- 如何从Objective-C代码中调用javascript代码
- 有什么工具可以轻松读取javascript代码吗
- 这个javascript代码是如何编写的
- 如何解密此javascript代码
- SIMPLE Javascript代码,用于显示谷歌电子表格中单个字段的数据
- HTML标记,包含带引号的JavaScript代码中的引号
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- addEventListener的Javascript代码不工作!?(单击时打开放大的img)
- JavaScript代码无法在表单上呈现部分
- 以下 JavaScript 代码与 Facebook 相关
- 使用解析为javascript源的.php,如何使用条件语句将javascript代码封装在php括号之间