IE10 Javascript "Function Expected"



此代码给我一个SCRIPT5002: Function expected错误:

var callIt = function(func) { func(); }

为什么!?这就像是在尝试进行类型检查之类的

编辑:用例

var callIt = function(func) { func(); }
function nextSlide() {
    var fn = currSlide ? currSlide.hide : callIt;
    currSlide = setupSlides[++slideIdx];
    fn(currSlide.show());
}

DOH!

您的代码:

fn(currSlide.show());

调用currSlide.show()并将调用后的返回值传递给fn,与foo(bar())调用bar并将其返回值传递到foo的方式完全相同。

由于show的返回值不是函数,因此会出现错误。你的意思可能是:

fn(function() { currSlide.show(); });

不过,请注意,这里有一个问题:

var fn = currSlide ? currSlide.hide : callIt;

如果currSlide是真的,您将获得对hide函数的引用,但该函数是,而不是以任何方式连接到currSlide。如果您稍后调用它,它很可能会失败,因为它期望this具有特定的含义。

如果您可以依赖ECMAScript5的功能(因此,您使用的是IE8以外的现代浏览器和/或包含"es5垫片",则可以使用Function#bind:解决此问题

var fn = currSlide ? currSlide.hide.bind(currSlide) : callIt;

或者,如果您正在使用jQuery,您可以使用jQuery的$.proxy:进行修复

var fn = currSlide ? $.proxy(currSlide.hide, currSlide) : callIt;

这两个函数都返回一个新函数,当被调用时,该函数将调用具有给定this值的目标函数。

如果你没有使用ES5或jQuery,那么,这就可以了:

var prevSlide = currSlide;
var fn = prevSlide ? function(func) { prevSlide.hide(func); } : callIt;

但在这一点上,我怀疑退一步重新评估可能是合理的。

相关内容

最新更新