特殊的Javascript非法调用类型错误

时间:2017-04-21 18:07:05

标签: javascript google-chrome error-handling runtime-error

所以,下面的例子运行得很好,花花公子。

document.write("<pre>");
try {
    document.writeln( document.querySelector );
    document.writeln( "example".indexOf );
    
    (function(x){
        var f=x;
        document.writeln( f + ",\n\t" + x.toString() );
    })( "example".indexOf );
    
    (function(x){ document.writeln(
        typeof x === typeof document.querySelector
    ) })( document.querySelector );
} catch(e) { document.writeln(
    "<span style='color:red'>" + e + "</span>"
) };
document.write("</pre>");

因此,这些内置函数似乎是可引用的,因为它们可以作为参数传递,用作变量,并且它们保留它们的对象原型(至少是toString)。然而,在chrome(至少)中,事情变得非常奇怪并且是一个类型错误:非法调用

document.write("<pre>");
try {
    (function(x){
        var f=x;
        document.writeln( f() );
    })( "example".indexOf );
    
    (function(x){ document.writeln(
        x()
    ) })( document.querySelector );
} catch(e) { document.writeln(
    "<span style='color:red'>" + e + "</span>"
) };
document.write("</pre>");

我的问题是:

  • 为什么会出现此错误?
  • 这个错误是W3标准的一部分吗?如果是的话,请引用。
  • 此错误或类似错误会出现在哪些浏览器中?
  • 除了代理函数 1 之外,是否有任何巧妙的解决此错误的方法,因为像这样的东西对于缩小脚本甚至更小是惊人的。

注意 1 :“代理功能”示例:

function proxy(x){
    return document.querySelector(x);
}

0 个答案:

没有答案