3

我无法在基于 WebKit 的浏览器中将本机代码函数用作 JavaScript 对象。难道不能直接给这些函数起别名吗?

这最容易通过示例来解释,所以这是我在开发人员工具控制台中运行的内容:

console.warn;
// Outputs:
// function warn() {
//     [native code]
// }

console.warn("console.warn");
// Outputs: "console.warn"

var _c = console;
_c.warn("_c.warn");
// Outputs: "_c.warn"

var _w = console.warn;
_w("_w");
// Outputs: "TypeError: Type error" on Safari/WebKit (Mac)
// Outputs: "TypeError: Illegal invocation" on Chrome (Mac)

var _w2 = function () { console.warn.apply(console, arguments); }
_w2("_w2");
// Outputs: "w2"

当我尝试在 Safari中使用jQuery Lint时出现了这个问题;如果 window.console 不存在,它使用以下方法来防止损坏:

_console = {
    warn: window.console && console.warn || function(){},
    ...
}

_console.warn("some error");

这是我的临时解决方法:

if((jQuery.browser.safari || jQuery.browser.webkit) && window.console) {
    jQuery.LINT.level = 3;
    jQuery.LINT.console = {
        warn: function() { console.warn.apply(console, arguments); },
        group: function() { console.group.apply(console, arguments); },
        groupEnd: function() { console.groupEnd(); },
        groupCollapsed: function() { console.group.apply(console, arguments); },
        log: function() { console.log.apply(console, arguments); }
    }
}
4

2 回答 2

7

您不能为 JavaScript 中的任何方法起别名,无论是否为原生、是否为 WebKit。

当您说 时var _w = console.warn;,您正在剥离warn其所有者对象console并将其视为独立函数。当您调用它时,它没有this对 的引用console,因此它无法工作。

您可能会发现这与绑定方法在其他语言中的工作方式不同,但这正是 JavaScript 方法调用的设计方式:this引用仅根据ownerin owner.method()(or owner['method']()) 中的内容传递给函数。如果在没有所有者的情况下单独调用该函数,this则将其设置为window对象,并且该方法很可能会失败。

要解决这个问题并传入正确的this,您必须按照@slebetman 的描述显式使用method.call(或method.apply),或者使用类似的闭包创建自己的绑定函数,var _w= function() { console.warn.apply(console, arguments) };或者,在 ECMAScript 第五版中,method.bind(owner).

于 2010-01-19T00:00:51.390 回答
2

那应该是:

console.warn.apply(console,arguments);

要应用的第一个参数是要传递给方法的this的值。warn

于 2010-01-18T23:33:09.550 回答