【问题标题】:TypeError: Illegal Invocation console.logTypeError:非法调用console.log
【发布时间】:2015-05-20 10:46:36
【问题描述】:

我正在学习 JavaScript 抽象。我想将一个函数作为参数传递给另一个函数。当我传入 console.log 时,它返回一个 TypeError:Illegal invocation

function forEvery(array,action){
    for(var i=0;i<array.length;i++){
       action(array[i]);
    }
}

forEvery(["test1","test2","test3"],console.log);

我希望这会记录传递数组中的所有元素。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    问题在于 console.log 没有使用正确的上下文 (this) 调用。

    改变

    forEvery(["test1","test2","test3"],console.log);
    

    forEvery(["test1","test2","test3"], Function.prototype.bind(console.log, console));
    

    请注意,使用非本地函数会更简单:您会使用

    forEvery(["test1","test2","test3"], console.log.bind(console));
    

    这也适用于大多数浏览器。

    但在 IE9(可能还有其他版本)中存在“限制”。 See related question.

    【讨论】:

    • 值得注意的是,没有保证console.log这样的主机提供的函数是真正的函数,所以不能保证它们会有Function#bind。但我认为在所有现代浏览器中都是如此。
    • @T.J.Crowder 事实上,你让我想起了my own question。 IE9 不是太旧,所以我会编辑
    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2016-12-07
    相关资源
    最近更新 更多