2015-02-03 5 views
0

Я пробовал искать это около часа и не могу найти решение, которое работает на меня. У меня есть функция (Function2) внутри объекта, вызываемого интервалом. Функция2 не может найти Function1 и говорит, что метод не существует. Почему это может быть, или что не так с моим синтаксисом?У объекта нет метода?

var ClassA = function() 
{ 
    this.attribute = ""; 

    this.function1 = function() 
    { 
     alert("Function 1"); 
    }; 

    this.function2 = function() 
    { 
     alert("Function 2"); 
     this.function1(); <----- Does not exist? 
    }; 

    this.function3 = function() 
    { 
     setInterval(this.function2, 5000); 
    }; 
}; 

var CLASS_A = new ClassA(); 
CLASS_A.function3(); 
+1

'' 'это поздняя регистрация в JS. Захватите его значение для использования внутри функций. –

+1

Другими словами: поместите 'var that = this;' в вершину ClassA и замените все 'this' на' that'. – Jonathan

+0

Это известный шаблон JS ... используйте 'var self = this;' в верхней части вашего класса, а затем обратитесь к внутренним функциям, используя 'self.functionName'. Когда вы находитесь внутри функции2,« это »относится к функции2 scope, а не класс. –

ответ

0

setInterval ведет себя асинхронно. Когда вы предоставляете this.function2 в качестве параметра setInterval, вы в основном предоставляете метод обратного вызова. Когда setInterval достиг 5000, он вызывает ваш метод обратного вызова.

Ключевое слово «this» изменяется в зависимости от контекста. Контекст обратного вызова сильно отличается от контекста «ClassA» вашего объекта. Это не то же самое "это".

Хитрость заключается в том, чтобы сделать это:

var ClassA = function(){ 

    var that = this; 

    //And then everywhere else use that instead of this. 
    that.function1 = function() { ... 

    that.function2 = function() { ... 
     that.function1 

    that.function3 = function .... 

} 

удачи.

0

Вы должны внимательно посмотреть о том, что this означает в JavaScript и в каком контексте ваша функция вызывается. Вы можете убедиться, что контекст является то, что вы собираетесь с помощью bind метод Function, как в следующем примере редактирования:

var ClassA = function() 
 
{ 
 
    this.attribute = ""; 
 

 
    this.function1 = function() 
 
    { 
 
     alert("Function 1"); 
 
    }; 
 

 
    this.function2 = function() 
 
    { 
 
     alert("Function 2"); 
 
     this.function1(); // Exists but only on the ClassA, not on Window 
 
    }; 
 

 
    this.function3 = function() 
 
    { 
 
     setInterval(this.function2.bind(this), 5000); 
 
    }; 
 
}; 
 

 
var CLASS_A = new ClassA(); 
 
CLASS_A.function3();