存储独特功能的集合

时间:2018-08-12 04:52:37

标签: javascript

<!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>

这是assert.js文件

function assert(value, text) {
  var li = document.createElement("li");
  li.className = value ? "pass" : "fail";
  li.appendChild(document.createTextNode(text));
  var results = document.getElementById("results");
  if (!results) {
    results = document.createElement("ul");
    results.setAttribute('id','results');
    document.body.appendChild(results);
  }
  results.appendChild(li);
}

function pass(text) { assert(true, text); }
function fail(text) { assert(false, text); }
function report(text) { pass(text); }

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

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

检查if (!fn.id)用于检查id是否为假,这表示尚未定义该属性。如果未定义,则可以通过将其设置为store.nextID进行定义,然后使用该ID作为密钥在fn内存储和访问store.cache

答案 1 :(得分:0)

由于javascript中的所有内容都是对象,所以即使函数也是对象。编码人员尝试通过使用以下语句<select id="chess"> <option value="black">BLACK</option> <option value="red">RED</option> <option value="yellow">YELLOW</option> </select> <table id="ta"> <tr class="chessboard"> <td></td> </tr> </table>检查以下代码段来检查该函数是否具有ID

!fn.id