IE10 Javascript“功能预期”

时间:2013-11-25 11:42:40

标签: javascript function internet-explorer

此代码给出了SCRIPT5002: Function expected错误:

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

WHY!?这就像它试图进行类型检查或其他什么

编辑:用例

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

DOH!

1 个答案:

答案 0 :(得分:7)

您的代码:

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;

......但在那时我怀疑退后一步并重新评估可能是有条不紊的。