Javascript Ninja列表的秘密4.8 - 如何引用此属性?

时间:2014-01-03 11:32:49

标签: javascript closures

我喜欢这本书,但有些例子没有完全解释发生了什么。以下是存储函数集合的缓存函数示例:

 var store = {
    nextId: 1,                                        //#1
    cache: {},                                        //#2
    add: function(fn) {                               //#3
      if (!fn.id) {                                   //#3
        fn.id = store.nextId++;                       //#3
        return !!(store.cache[fn.id] = fn);           //#3
        // not a fan of the above construct - I think the following is clearer:
        // store.cache[fn.id] = fn;
        // return true;
      }                                               //#3
    }
  };

  function ninja(){}

  assert(store.add(ninja),                            //#4
         "Function was safely added.");               //#4
  console.log('ninja does not have an id property now:',ninja);
  assert(!store.add(ninja),                           //#4
         "But it was only added once.");              //#4

大部分内容非常明显 - 当第一次调用store.add(ninja)时,fn param没有看到id属性,因此它将store.nextId变量添加为id属性。

我没有得到的是如何在下次调用store.add(ninja)时实际引用该fn.id属性。无论函数ninja是在store变量之前还是之后定义,在第一次调用store.add(ninja)之后记录ninja并不表示ninja现在有一个通过引用添加的id属性。所以当第二次将ninja传递给store.add时,add()如何知道fn param现在有一个id属性?

这是作者没有解释的一些封闭魔法吗?

1 个答案:

答案 0 :(得分:3)

按要求回答我的评论。

第一次致电store.add(ninja)后,忍者功能确实拥有了id属性。

DEMO

您应该console.dir(ninja)(而不是console.log)查看其属性/原型方法