如何在 Javascript 命名空间脚本中创建函数数组



我正在尝试在我的脚本中使用一系列函数。我使用命名空间对象,当我使用这个数组时,我的所有函数都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]
};

在你的代码中,this要么指window,要么指你定义myns函数范围内的this值,这就是你看到undefined的原因。您需要的是对调用对象的引用。你应该能够用这样的东西来做到这一点:

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.getReplaceFilters 时,this指向my.test.util 。当你打电话给myns.test.util.processAllFunction()时,同样的事情也会发生在this身上; this再次设置为 myns.test.util 。当您在 processAllFunction 中调用 getReplaceFilters 时,也使用这个 this 值。

我找到了解决方案,在对象外部使用 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没有问题.

最新更新