未捕获的TypeError:非法调用(...)循环遍历本机对象时

时间:2016-06-16 04:18:36

标签: javascript

我希望能够将本机对象的API密钥/类型打印到控制台,但我得到Uncaught TypeError:非法调用(...)错误。

我认为问题是因为某些属性是使用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(…)

1 个答案:

答案 0 :(得分:0)

正如Arun P Johny所说,这将打印出API,问题确实是因为在使用getter和setter函数设置属性时,typeof obj [keys [i]]会将这些函数称为脱离上下文。

function keys_vals( obj ) {
    var keys = Object.keys( obj );
    for ( var i = 0; i < keys.length; i++ ) {
        try {
            console.log( keys[i], obj[keys[i]], typeof obj[keys[i]] );
        } catch ( e ) {
            console.log( keys[i], Object.getOwnPropertyDescriptor( obj, keys[i] ) );
        }
    }
}