我无法在基于WebKit的浏览器中将本机代码函数用作JavaScript对象.是不是可以直接别名这些功能?
这是最容易通过示例解释的,所以这是我在Developer Tools控制台中运行的内容:
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); } } }
bobince.. 7
您不能使用JavaScript 替换任何方法,无论是否是本机,WebKit.
当你说var _w = console.warn;
,你正在剥离warn
它的所有者对象console
并将其视为一个独立的功能.当你调用它时,它没有this
引用console
它,所以它无法工作.
您可能会发现从绑定方法在其他语言中是如何工作的这种不寻常的,但是这是JavaScript的方法调用是如何设计:在this
引用传递给基础功能完全对什么owner
是owner.method()
(或owner['method']()
).如果在没有所有者的情况下单独调用该函数,则将该函数this
设置为该window
对象,并且该方法很可能会倒下.
要解决这个问题并传入一个正确的内容this
,你必须使用method.call
(或method.apply
)显式地使用@slebetman描述,或者var _w= function() { console.warn.apply(console, arguments) };
在ECMAScript第五版中使用类似or 的闭包创建自己的绑定函数method.bind(owner)
.
您不能使用JavaScript 替换任何方法,无论是否是本机,WebKit.
当你说var _w = console.warn;
,你正在剥离warn
它的所有者对象console
并将其视为一个独立的功能.当你调用它时,它没有this
引用console
它,所以它无法工作.
您可能会发现从绑定方法在其他语言中是如何工作的这种不寻常的,但是这是JavaScript的方法调用是如何设计:在this
引用传递给基础功能完全对什么owner
是owner.method()
(或owner['method']()
).如果在没有所有者的情况下单独调用该函数,则将该函数this
设置为该window
对象,并且该方法很可能会倒下.
要解决这个问题并传入一个正确的内容this
,你必须使用method.call
(或method.apply
)显式地使用@slebetman描述,或者var _w= function() { console.warn.apply(console, arguments) };
在ECMAScript第五版中使用类似or 的闭包创建自己的绑定函数method.bind(owner)
.