2013-11-25 38 views
2

此代碼是給我一個SCRIPT5002: Function expected錯誤:IE10的JavaScript 「功能預計」

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!

+3

和你傳入'callIt'作爲參數的是什麼? –

+0

一個函數。 'callIt'是作爲一個tmp函數來替換jquery動畫函數。例如:'(currentSlide?currentSlide.hide:callIt)(nextSlide.fadeIn)' –

+0

@MarkusOrreilly:顯示對'callIt'的調用,這就是錯誤所在。 –

回答

7

您的代碼:

fn(currSlide.show()); 

... 電話currSlide.show()和調用它變成fn傳遞的返回值,完全相同的方式foo(bar())電話bar並將其返回值到foo

由於show的返回值不是函數,所以會出現錯誤。你可能意味着:

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

但是請注意,您在這裏有一個問題:

var fn = currSlide ? currSlide.hide : callIt; 

如果currSlide是truthy,你會得到的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; 

......但在這一點上,我懷疑退一步重新評估,並可能是爲了。