2013-03-05 121 views
2

我寫一個模塊:的javascript:對象不是一個函數

window.FileReader = (function() { 

     var read = function (file) { 
      var reader = new FileReader(); 

      reader.onload = function (e) { 
       console.log(e.target); 
      }; 

      // reader.readAsDataURL(file); 
     }; 

     return { 
      read: read 
     }; 
    })(); 

,但是當我執行

FileReader.read() 

它總是警告我object is not functionvar reader = new FileReader()

有什麼錯我的代碼?

+1

http://www.html5rocks.com/en/tutorials/file/dndfiles/?redirect_from_locale=com你有怎麼做。 – axierjhtjz 2013-03-05 08:38:00

回答

6

這是說,因爲你已經使FileReader不是一個函數,所以你用一個對象(它有一個叫做read的函數)取代它。所有全局變量都是全局對象(window,在瀏覽器上)的屬性,因此通過設置window.FileReader = { ... };,您將替換全局對象的FileReader函數。

您似乎試圖使用File API。既然如此,您希望而不是調用您的全局模塊對象FileReader,正如File API定義的那樣。說它更具體的東西給你(這裏我使用Foo作爲一個明顯的廢話爲例):

window.Foo = (function() { 

    var read = function (file) { 
     var reader = new FileReader(); 

     reader.onload = function (e) { 
      console.log(e.target); 
     }; 

     // reader.readAsDataURL(file); 
    }; 

    return { 
     read: read 
    }; 
})(); 

// Usage: 
Foo.read(); 
0

當這行代碼:

var reader = new FileReader(); 

確保你在你的FileReader定義功能代碼如下。

window.FileReader = function(){ 
    ... 
}; 

在你的代碼,你只返回一個對象,並將其分配給window.FileReader,不是一個函數,視你爲下面的代碼:

window.FileReader = (function() { ... return {}; })(); 

希望它會幫助你。

0

您已經定義的FileReader與屬性讀取的對象:Object {read: function} 您首先應該確定的FileReader作爲構造函數是這樣的:

FileReader = function() { var read = function (file) { var reader = new FileReader();

 reader.onload = function (e) { 
      console.log(e.target); 
     }; 

     // reader.readAsDataURL(file); 
    }; 

    return { 
     read: read 
    }; 
}; 

然後你就可以創建這樣的一個對象:

var object = new FileReader();

0

通過時間window.FileReader被分配,則該函數read沒有被調用,因而var reader = new FileReader();未執行。

事實上,它只有在您撥打FileReader.read()後纔會執行。但是那個時候FileReader裏面的值read函數已經被你的window.FileReader取代了。

移動var reader = new FileReader();function,這使得它被先前執行將消除錯誤的:

window.FileReader = (function() { 
    var reader = new FileReader(); 

    var read = function (file) { 
     reader.onload = function (e) { 
      console.log(e.target); 
     }; 

     // reader.readAsDataURL(file); 
    }; 

    return { 
     read: read 
    }; 
})(); 

不過,我不認爲這是有變數,尤其是全局變量是個好主意,同名作爲來自系統API的東西。所以我更喜歡T.J.克羅德的方式:只是改變全局變量的名稱。

相關問題