我在 IE8(也可能是任何 IE 版本)上使用 javascript 扩展(又名 window.external)来公开某些功能。
我正在尝试调用 apply 函数,该函数(根据 here 应该是)在 window.external 对象的每个 JS 函数中原生嵌入函数,但浏览器不断抛出异常,表明该函数不存在 apply 函数。
例如,这段代码有效:
function onDataReceived(url, success, status, data, errorMessage) {
alert(onDataReceived);
}
function innerTest() {
alert(arguments[0] + ", " + arguments[1]);
}
function outerTest() {
innerTest.apply(null, arguments);
}
outerTest("hello", "world");
// alerts "hello, world"
但是这段代码抛出异常:
function outerTest() {
window.external.innerTest.apply(null, arguments); // <-- exception
}
outerTest("hello", "world");
底线是 - 我需要将未知数量的参数传递给外部函数,到目前为止我已经走到了死胡同......
有什么想法吗?
编辑:
我接受了 Mike Samuel 的回答,因为(据我所知)apply
函数在 window.external
对象中不存在,因为它不是 native javascript 对象。< br/>
Mike 建议的“最坏情况”是我目前最终所做的。
谢谢
最佳答案
如果 window.external
是一个宿主对象,或者来自一些不希望其原型(prototype)暴露给页面逻辑的扩展机制,那么它可能是一个函数,但可能没有通常的 调用
并申请成员(member)。幸运的是,您可以调用 call
并应用 apply
:
Function.prototype.apply.call(window.external, null, [argumentsToExtension])
或者是真正的元,
Function.prototype.apply.apply(window.external, [null, [argumentsToExtension]])
其中 null
是作为 this
的值传递的,通常的调用/应用规则应将其解释为 window
。
编辑:
如果这不起作用,您总是可以退回到黑客三 Angular 。
function triangleOfHackery(obj, methodName, args) {
switch (args.length) {
case 0: return obj[methodName]();
case 1: return obj[methodName](args[0]);
case 2: return obj[methodName](args[0], args[1]);
case 3: return obj[methodName](args[0], args[1], args[2]);
...
}
}
关于javascript - Javascript "apply"函数在 window.external 扩展对象中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514082/