gpt4 book ai didi

javascript - 在 WebKit 中使用 native 代码函数作为 JavaScript 对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:01 24 4
gpt4 key购买 nike

我无法在基于 WebKit 的浏览器中将 native 代码函数用作 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"

这个问题是在我尝试使用 jQuery Lint 时出现的在 Safari 中;如果 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); }
}
}

最佳答案

您不能在 JavaScript 中为 任何 方法设置别名,无论是否为 native ,是否为 WebKit。

当你说 var _w = console.warn; , 你正在剥离 warn远离其所有者对象 console并将其视为一个独立的功能。当你调用它时,它不会得到 this引用console , 所以它无法工作。

您可能会发现绑定(bind)方法在其他语言中的工作方式不同寻常,但这正是 JavaScript 方法调用的设计方式:this引用被传递给一个完全基于什么的函数 ownerowner.method() (或 owner['method']() )。如果函数在没有所有者的情况下单独调用,this设置为 window对象和方法很可能会倒下。

为了解决这个问题并传递一个合适的 this ,您必须使用 method.call (或 method.apply )明确如@slebetman 所述,或使用像 var _w= function() { console.warn.apply(console, arguments) }; 这样的闭包创建您自己的绑定(bind)函数或者,在 ECMAScript 第五版中,method.bind(owner) .

关于javascript - 在 WebKit 中使用 native 代码函数作为 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com