0

スクリプトに関数の配列を使用しようとしています。名前空間オブジェクトを使用していますが、この配列を使用すると、すべての関数がになりundefinedます。

これを処理するための適切な関数参照を使用してこの配列を作成するにはどうすればよいprocessAllFunctionですか?

私のコードを参照してください:

var myns = myns || {};
myns.test = myns.test || {};
myns.test.util = {
    myOne: function(m) {
        return m;
    },
    myTwo: function(m) {
        return m;
    },
    processAllFunction: function(m) {
        for(var i=0; i<this.replaceFilters.length; i++) {
            if(typeof(this.replaceFilters[i])==='function') {
            m= this.replaceFilters[i](m);
        }
        }
        console.log(this.replaceFilters); // undefined functions
        return m;
    },
    replaceFilters: [this.myOne, this.myTwo]
};
4

2 に答える 2

1

コード内で、は、定義している関数のスコープ内のの値をthis参照するか、参照します。これが、が表示される理由です。必要なのは、呼び出し元オブジェクトへの参照です。あなたはこのようなものでそれを行うことができるはずです:windowthismynsundefined

var myns = myns || {};
myns.test = myns.test || {};
myns.test.util = {
    myOne: function(m) {
        return m;
    },
    myTwo: function(m) {
        return m;
    },
    processAllFunction: function(m) {
        for(var i = 0; i < this.getReplaceFilters().length; i++) {
            if(typeof(this.getReplaceFilters()[i]) === 'function') {
               m= this.replaceFilters[i](m);
            }
        }
        return m;
    },
    getReplaceFilters: function() {
        return [this.myOne, this.myTwo];
    }    
};

replaceFilters単に値を持つのではなく、[this.myOne, this.myTwo]を返す関数になっていることに注意してください[this.myOne, this.myTwo]。これは、を呼び出すときにmyns.test.util.getReplaceFiltersthisを指すためmy.test.utilです。this呼び出したときにも同じことが起こりますmyns.test.util.processAllFunction()thisに再び設定されmyns.test.utilます。この値は、 insidethisを呼び出すときにも使用されます。getReplaceFiltersprocessAllFunction

于 2012-06-25T15:27:18.520 に答える
0

私は解決策を見つけました。オブジェクトの外部でreplaceFiltersを使用します(宣言後)。

myns.test.util = {
    myOne: function(m) {
        return m;
    },
    myTwo: function(m) {
        return m;
    },
    processAllFunction: function(m) {
        for(var i=0; i<this.replaceFilters.length; i++) {
            if(typeof(this.replaceFilters[i])==='function') {
            m= this.replaceFilters[i](m);
        }
        }
        console.log(this.replaceFilters);
        return m;
    }
};
myns.test.util.replaceFilters = [this.myOne, this.myTwo];

この方法では、問題はありませんthis

于 2012-06-28T08:25:53.157 に答える