我正在完成第4章Eloquent Javascript中第一个例子的结尾。这是完整的代码(这是我有问题的最后一部分,但我附上了第一部分供参考)。
var journal = [];
function addEntry(events, didITurnIntoASquirrel) {
journal.push({
events: events,
squirrel: didITurnIntoASquirrel
});
function phi(table) {
return (table[3] * table[0] - table[2] * table[1]) /
Math.sqrt((table[2] + table[3]) *
(table[0] + table[1]) *
(table[1] + table[3]) *
(table[0] + table[2]));
}
function hasEvent(event, entry) {
return entry.events.indexOf(event) != -1;
}
function tableFor(event, journal) {
var table = [0, 0, 0, 0];
for (var i = 0; i < journal.length; i++) {
var entry = journal[i], index = 0;
if (hasEvent(event, entry)) index += 1;
if (entry.squirrel) index += 2;
table[index] += 1;
}
return table;
}
function gatherCorrelations(journal) {
var phis = {};
for (var entry = 0; entry < journal.length; entry++) {
var events = journal[entry].events;
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (!(event in phis))
phis[event] = phi(tableFor(event, journal));
}
}
return phis;
}
var correlations = gatherCorrelations(JOURNAL);
console.log(correlations.pizza);
我的问题是:
中.events的目的是什么?
var events = journal[entry].events;
它是否将自身称为递归?如果是这样的话?难道我们不能只使用journal [entry]并且函数会从tableFor函数调用条目吗?它是否以重要方式回调AddEntry函数(已建立事件变量的位置)?
(!(event in phis))
。我将其读作:如果phis中的事件为真,则将其翻转为不成立,然后触发必要的phi计算。消除它是不是更有意义! (不等于)或那段代码?如果我们已经有一个for循环,那么函数会在它上面运行,直到日志和停止的最大长度?
答案 0 :(得分:0)
var events = journal[entry].events;
您从数组events
中索引为entry
的对象获取journal
对象,并将其分配给名为events
的临时变量。
这只是为了方便起见,因此您不必继续引用journal[entry].events
。例如,稍后就有这一行:
var event = events[i];
将成为:
var event = journal[entry].events[i];
没有赋值给临时变量。
if(!(event in phis))
它正在测试对象phis
是否没有名称包含在变量event
中的属性。如果对象尚未具有该属性,则将其添加到下一行:
phis[event] = phi(tableFor(event, journal));
请参阅in operator
这是一段非常简单的代码片段,可帮助您了解in
运算符:
var foo = {};
console.log("bar" in foo); // logs "false" because foo doesn't have a "bar" property
foo.bar = 1; // or foo["bar"] = 1;
console.log("bar" in foo); // logs "true" because foo now has a "bar" property
答案 1 :(得分:0)
中.events的目的是什么?
var events = journal [entry] .events;
本声明的目的符合脚本方便和经济的两个概念。对象深度的每个级别都会在调用时增加整个调用时间。当然,现代浏览器已经做了很多事情来展平对象变量堆栈,但如果你从逻辑上考虑它,任何调用object1.object2 [&#34; Memeber3&#34;]。object4必须通过4个步骤才能到达重视自己。将值展平为本地对象更经济。其次,代码的可读性(以及可维护性)得到了增强,因为你没有额外的&#34; journal [entry]。&#34;堵塞你的表情。作为一般经验法则,如果您要在块中多次使用对象的成员,那么您应该创建该成员的局部变量。
的目的是什么?
(!(在phis中的事件))。
此评估的目的是确定特定成员(事件)是否不在对象(phis)中。在此示例中,如果确实缺少该成员,则下一行将创建该成员。