Javascript 存储唯一函数的集合

Javascript 存储唯一函数的集合,javascript,Javascript,这段代码来自“javascript忍者的秘密,第二版”。我的问题是关于if(!fn.id)这行代码。什么是身份证?那这个呢!不在fn之前吗 提前感谢。名称fn是传递给方法存储的任何参数(Ninja函数)的别名。添加。属性fn.id提供了一种独特的方法来识别store.cache中的Ninja函数 检查if(!fn.id)用于检查id是否为假,在本例中,这意味着尚未定义属性。如果没有定义,可以通过将其设置为store.nextID来定义它,然后使用该id作为键来存储和访问store.cache内部

这段代码来自“javascript忍者的秘密,第二版”。我的问题是关于
if(!fn.id)
这行代码。什么是身份证?那这个呢!不在fn之前吗


提前感谢。

名称
fn
是传递给方法
存储的任何参数(
Ninja
函数)的别名。添加
。属性
fn.id
提供了一种独特的方法来识别
store.cache
中的
Ninja
函数


检查
if(!fn.id)
用于检查
id
是否为假,在本例中,这意味着尚未定义属性。如果没有定义,可以通过将其设置为
store.nextID
来定义它,然后使用该id作为键来存储和访问
store.cache

内部的
fn
,因为javascript中的所有内容都是对象,即使函数也是对象。编码器试图使用以下语句检查该函数是否有id!fn.id
检查下面的代码段

函数sayHi(){
控制台日志(“Hola”)
}
sayHi()/“你好”
//让我们检查函数是否有id
//(它可以是我们想要的任何变量,而不仅仅是id)
console.log(sayHi.id)//未定义
//因为javascript在(!undefined)语句中返回true
console.log(!undefined)//true
//我们可以用它来检查变量是否未定义(或未设置)
如果(!sayHi.id){
log(“sayHi.id未定义:”+sayHi.id)
}否则{
console.log(“sayHi.id已定义:“+sayHi.id”)
}
//我们可以继续申报
sayHi.id=21
如果(!sayHi.id){
log(“sayHi.id未定义:”+sayHi.id)
}否则{
console.log(“sayHi.id已定义:“+sayHi.id”)
}
//因此,通过说(!fn.id),编码器只是想检查函数是否还没有id
查看my@monirehd以获得详细解释。
<!DOCTYPE html>
<html>
<head>
  <title>Storing a collection of unique functions</title>
  <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="assert.css">
  <script src="assert.js"></script>
</head>
<body>
<script>
  var store = {
    nextId: 1,
    cache: {},
    add: function(fn) {
      if (!fn.id) {
        fn.id = this.nextId++;
        this.cache[fn.id] = fn;
        return true;
      }
    }
  };

  function ninja() {}

  assert(store.add(ninja), "Function was safely added.");
  assert(!store.add(ninja), "But it was only added once.");

  </script>
 </body>
</html>