先贴两段代码:
// is-callable.js var $documentAll = require('../internals/document-all'); var documentAll = $documentAll.all; // `IsCallable` abstract operation // https://tc39.es/ecma262/#sec-iscallable module.exports = $documentAll.IS_HTMLDDA ? function (argument) { return typeof argument == 'function' || argument === documentAll; } : function (argument) { return typeof argument == 'function'; };
// document-all.js var documentAll = typeof document == 'object' && document.all; // https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot // eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined; module.exports = { all: documentAll, IS_HTMLDDA: IS_HTMLDDA };
判断一个参数/变量是否可调用,即是否为函数。通常我们是这么理解的。但是,从上面的代码来看,有一个特例:document.all。
这个属性行为比较特殊。
document.all // HTMLAllCollection { 0: html, 1: head, 2: meta, 3: meta, 4: meta, 5: meta, 6: link, 7: link, 8: link, 9: link , … } document.all() // null typeof document.all // "undefined" document.all === undefined // false
这是在 firefox 浏览器里的表现。可以看出来,这个属性行为很反常,因此 core-js 做了特殊处理。
html5 已经不推荐使用该属性,部分浏览器仍保留了兼容。