首页 > 解决方案 > 存储一组独特的功能

问题描述

<!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 ninja 的秘密,第二版”。我的问题是关于if (!fn.id)这行代码。什么是身份证?怎么样 !逻辑上不在 fn 之前?

提前致谢。

标签: javascript

解决方案


该名称是您传递给方法fn的任何参数(函数)的别名。该属性提供了一种识别内部函数的独特方法。Ninjastore.addfn.idNinjastore.cache

该检查if (!fn.id)用于检查 是否id为假,在这种情况下意味着该属性尚未定义。如果未定义,则通过将其设置为来定义它,store.nextID然后使用该 id 作为在fn内部存储和访问的键store.cache


推荐阅读