4

好的,我在网上找了很多,但找不到答案。

我可以期待浏览器之间的 CSS 差异,但也有 JavaScript 差异?

那么为什么这在 IE8 中有效:

window.print(); // works

但是当我传递window.print给一个函数并调用它时,它在 IE8 中不起作用(在 IE9 中起作用):

function callIt(f){
    f.call();
};



callIt(window.print);

这是一个已知问题吗?


编辑

好的,它不起作用意味着它会简单地忽略它,没有 javascript 错误或任何东西。

对不起,它给出了这个错误:

   Object doesn't support this property or method

编辑 2

我需要使用callorapply因为我需要传递上下文。我正在尝试创建一个可以传递函数的类,并且可以通过传递上下文或参数来调用它。不要告诉我使用f() 这不是答案,因为它不能解决我的问题。问题在call和上apply

4

3 回答 3

10

似乎window.*函数是与 IE < 9 中用户创建的函数不同的类型。因此,它们没有任何Function.prototype.*. 你会看到的

typeof alert === 'object'

function a(){}

typeof a === 'function'

任何功能都会发生这种情况window.*。仅适用于 IE < 9。 WTG Miscrosoft。

不过你可以试试

Function.prototype.call.call(window.print)

看看这是否适合你。

于 2011-07-29T15:32:13.337 回答
2
    function callIt(f) {
        if (f) f();
    }

    callIt(window.print);

完成了,不是吗?


更新

根据发帖人的要求,我回答了这个问题,而不是推荐一个可行的解决方案,她说:

如果您在 IE 中查看 typeof(window.print),您会看到它报告自己为类型对象。类型对象没有应用或调用方法。在我看来,你的设计不适合这项任务。然而,如果你想要的是一个兔子洞,这里是顶部:

var p = window.print;
window.print = function() { p(); }

function callIt(f){
     f.call();
}

callIt(window.print);

我不知道在任何其他浏览器中会发生什么,也不知道您必须做出多少程序异常才能在需要的任何地方解决它。

于 2011-07-29T14:06:31.103 回答
1

你几乎肯定不应该.call()在这里使用。f()将调用该方法,而f.call()将使用 unset 调用它this。在 es3(但不是 es5 strict)下,未定义的值 forthis将被强制转换为window. 我怀疑 IE9 可以正确处理这个问题,而 IE8 没有,但这只是基于行为的猜测。

如果print关心 的值this,您应该调用它window.print(),以便this正确设置。在这种情况下,您可能必须将其包装在一个匿名函数中,这样print就不会“切掉”窗口。callIt(function() { window.print();});

于 2011-07-29T14:58:18.187 回答