【发布时间】:2016-06-16 13:22:40
【问题描述】:
我希望能够将本机对象的 API 密钥/类型打印到控制台,但出现 Uncaught TypeError: Illegal invocation(...) 错误。
我认为问题在于某些属性是使用 getter 和 setter 创建的,并且在运行 typeof obj[keys[i]] 时,它会脱离上下文调用该函数。
function keys_vals( obj ) {
var keys = Object.keys( obj );
for ( var i = 0; i < keys.length; i++ ) {
console.log( keys[i], typeof obj[keys[i]] );
}
}
样品运行
key_vals(Node.prototype)
---------------------------
ELEMENT_NODE 1 number
ATTRIBUTE_NODE 2 number
TEXT_NODE 3 number
CDATA_SECTION_NODE 4 number
ENTITY_REFERENCE_NODE 5 number
ENTITY_NODE 6 number
PROCESSING_INSTRUCTION_NODE 7 number
COMMENT_NODE 8 number
DOCUMENT_NODE 9 number
DOCUMENT_TYPE_NODE 10 number
DOCUMENT_FRAGMENT_NODE 11 number
NOTATION_NODE 12 number
DOCUMENT_POSITION_DISCONNECTED 1 number
DOCUMENT_POSITION_PRECEDING 2 number
DOCUMENT_POSITION_FOLLOWING 4 number
DOCUMENT_POSITION_CONTAINS 8 number
DOCUMENT_POSITION_CONTAINED_BY 16 number
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 32 number
Uncaught TypeError: Illegal invocation(…)
【问题讨论】:
-
只是增强像
function key_vals(obj) { var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { try { console.log(keys[i], typeof obj[keys[i]]); } catch (e) { console.error(keys[i], e) } } }这样的方法会给你导致错误的关键 -
可能是,该属性有一个 getter 方法,当在非 NodeType 实例上调用该方法时会引发错误,在您的情况下,您是在原型对象上调用它
-
布鲁我做了很多迭代的事情,这件事也在发生
标签: javascript