2014-06-23 62 views
2

我有以下簡單的代碼:功能成爲對象

someFields.forEach(
     function (itemId) {window.opener.Xrm.Page.getControl(itemId).setDisabled(true);}); 

的forEach實現爲每MDN(我們要支持IE8 +)。

的問題是該型號:

if ({}.toString.call(callback) !== "[object Function]") { 
     throw new TypeError(callback + " is not a function"); 
    } 

瀏覽器(IE9在IE7兼容模式)識別我的回調爲[對象的對象]而非[對象功能]。但是,該對象具有調用方法,並且如果刪除此檢查,則函數可以正常工作。
任何人都可以澄清爲什麼我看到這樣的行爲?

+3

JOOI,你爲什麼在IE7兼容模式下運行時,你只需要支持IE8 +? –

+0

不會''call(callback)'返回'callback'的返回值而不是'callback'本身?你能提供一個[小提琴](http://jsfiddle.net/),我們可以玩嗎? – sp00m

+0

@ sp00m:不,它會將調用的返回值返回給'{} .toString'函數 – Bergi

回答

0

您正在依靠toString方法來檢測實例的類型。即使在Java 7虛擬機和標準的基礎對象類的情況下,這個方法也是不可靠的。返回值取決於vm的供應商。

一般來說,除非您擁有並維護API,否則toString永遠不可預測。永遠不要解析它或比較它來推導邏輯。

...使用Modernizr的檢測瀏覽器