2013-03-05 77 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.克罗德的方式:只是改变全局变量的名称。

相关问题