我喜欢这本书,但有些例子没有完全解释发生了什么。以下是存储函数集合的缓存函数示例:
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属性?
这是作者没有解释的一些封闭魔法吗?
答案 0 :(得分:3)
按要求回答我的评论。
第一次致电store.add(ninja)
后,忍者功能确实拥有了id属性。
您应该console.dir(ninja)
(而不是console.log)查看其属性/原型方法