【问题标题】:Uncaught TypeError: Illegal invocation(…) When looping through native objectsUncaught TypeError: Illegal invocation(…) 当循环遍历本机对象时
【发布时间】: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 &lt; keys.length; i++) { try { console.log(keys[i], typeof obj[keys[i]]); } catch (e) { console.error(keys[i], e) } } }这样的方法会给你导致错误的关键
  • 可能是,该属性有一个 getter 方法,当在非 NodeType 实例上调用该方法时会引发错误,在您的情况下,您是在原型对象上调用它
  • 布鲁我做了很多迭代的事情,这件事也在发生

标签: javascript


【解决方案1】:

正如 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] ) );
        }
    }
}

【讨论】:

  • typeof obj[keys[i]] 没有调用任何函数?
  • @Bergi 我认为如果使用 setter /getter 函数设置的属性将被调用,返回的是 typeof 将使用的内容
  • 是的,但为什么 getter 会抛出 Illegal invocation 错误?它是在安装它的obj 上调用的,没有什么可出错的。无论如何typeof 与它无关。
猜你喜欢
  • 2016-06-22
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多