2012-06-25 2 views
0

Я пытаюсь использовать в моем скрипте ряд функций. Я использую объект namespacing, и когда я использую этот массив, все мои функции: undefined.Как создать массив функций в сценарии пространства имен Javascript

Как создать этот массив с хорошими функциями ссылки для обработки этого 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] 
}; 

ответ

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.

1

В коде this либо относится к window или к значению this в области видимости функции, где вы определяете myns, поэтому вы видите 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. То же самое происходит с this, когда вы позвоните myns.test.util.processAllFunction(); this снова установлен на myns.test.util. Это значение this, которое также используется, когда вы звоните getReplaceFilters внутри processAllFunction.

+0

Спасибо за объяснение 'this', но я не могу изменить свои фильтры вне класса/пространства имен с помощью этого метода ... – Aure77

Смежные вопросы