2

私はモジュールを書きます:

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 functionそれはいつも私に警告しますvar reader = new FileReader()

私のコードの何が問題になっていますか?

4

4 に答える 4

7

関数を作成してFileReaderいないため、オブジェクト(という関数を持つread)に置き換えたということです。すべてのグローバルはグローバルオブジェクト(windowブラウザでは、)のプロパティであるため、を設定することにより、グローバル関数をオブジェクトwindow.FileReader = { ... };に置き換えます。FileReader

FileAPIを使用しようとしているようです。その場合、File APIで定義されているため、グローバルモジュールオブジェクトを呼び出さないでください。FileReaderそれをあなたにもっと具体的なものと呼んでください(ここでは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();
于 2013-03-05T08:37:52.143 に答える
0

この行をコーディングするとき:

var reader = new FileReader();

以下のように、コードでFileReader関数を定義してください。

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

コードでは、オブジェクトを返し、それをwindow.FileReaderに割り当てるだけで、関数ではありません。次のようにコードを記述してください:</ p>

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

それがあなたを助けることを願っています。

于 2013-03-05T08:44:15.003 に答える
0

FileReaderをプロパティreadを持つオブジェクトとして定義しました。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();

于 2013-03-05T08:44:48.953 に答える
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の名前と同じ名前の変数、特にグローバル変数を使用するのは良い考えではないと思います。したがって、TJ Crowderの方法を使用したいと思います。つまり、グローバル変数の名前を変更するだけです。

于 2013-03-05T08:54:07.840 に答える