Eloquent Javascript第二名。第4章计算相关性。最终分析 - [可变递归&在运营商] Pt 2

时间:2014-10-10 20:55:06

标签: javascript

我正在完成第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);

我的问题是:

  1. 中.events的目的是什么?

    var events = journal[entry].events;

  2. 它是否将自身称为递归?如果是这样的话?难道我们不能只使用journal [entry]并且函数会从tableFor函数调用条目吗?它是否以重要方式回调AddEntry函数(已建立事件变量的位置)?

    1. (!(event in phis))
    2. 的目的是什么?

      我将其读作:如果phis中的事件为真,则将其翻转为不成立,然后触发必要的phi计算。消除它是不是更有意义! (不等于)或那段代码?如果我们已经有一个for循环,那么函数会在它上面运行,直到日志和停止的最大长度?

2 个答案:

答案 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)

  1. 中.events的目的是什么?

    var events = journal [entry] .events;

  2. 本声明的目的符合脚本方便和经济的两个概念。对象深度的每个级别都会在调用时增加整个调用时间。当然,现代浏览器已经做了很多事情来展平对象变量堆栈,但如果你从逻辑上考虑它,任何调用object1.object2 [&#34; Memeber3&#34;]。object4必须通过4个步骤才能到达重视自己。将值展平为本地对象更经济。其次,代码的可读性(以及可维护性)得到了增强,因为你没有额外的&#34; journal [entry]。&#34;堵塞你的表情。作为一般经验法则,如果您要在块中多次使用对象的成员,那么您应该创建该成员的局部变量。


    1. 的目的是什么?

      (!(在phis中的事件))。

    2. 此评估的目的是确定特定成员(事件)是否不在对象(phis)中。在此示例中,如果确实缺少该成员,则下一行将创建该成员。