<!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之前?
提前谢谢。
答案 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