2016-11-07 3 views
0

Ich denke, ich habe eine Schließung Problem, aber ich habe eine harte Zeit zu versuchen, es zu lösen. Ich dachte, dass die Verwendung von $ .map jedes Problem verhindern würde.Wahrscheinlich ein weiteres Javascript Closure Problem

Siehe Javascript unten (erfordern Zepto oder jQuery zu arbeiten) oder den Code Arbeits Zugriff https://jsfiddle.net/rowcp07n/4/:

"use strict"; 
var log = function(){ 
    var output = document.getElementById('output'); 
    for(var i in arguments){ 
    output.append(JSON.stringify(arguments[i])); 
    output.appendChild(document.createElement('br')); 
    output.appendChild(document.createElement('hr')); 
    } 
}; 

function EmptyAction(){ 
    self = this; 
    self.play = function(){ 
     self.complete(); 
    }; 
}; 

function Scene(row, i){ 
    log('Constructing Scene '+i); 
    var self = this; 
    self.index = i; 
    self.steps = $.map(row, function(col, i){ 
     return new SceneStep(row[i], self, i); 
    }); 
} 

function SceneStep(col, scene, i){ 
    log('Constructing SceneStep '+i+' for Scene '+scene.index); 
    var self = this; 
    self.index = i; 
    self.action = new EmptyAction(); 
    self.action.parentStep = self; 
    self.action.complete = function(){ 
     log('Complete handler for SceneStep '+ self.index); 
    }; 
    self.value = col; 
} 

var data = [ 
    [1,2,3], 
    [4,5,6], 
    [7,8,9] 
]; 

function ViewModel(data){ 
    var self = this; 
    self.scenes = $.map(data, function(row, i){ 
     return new Scene(row, i); 
    }); 
} 

var vm = new ViewModel(data); 
log('Triggering complete of 0-0'); 
vm.scenes[0].steps[0].action.complete(); 
log('calling play() of 0-0'); 
vm.scenes[0].steps[0].action.play(); 

Ich erwarte, dass am Ende des Protokolls, um zu sehen, "Complete-Handler für SceneStep 0" aber ich bin immer „Complete-Handler für SceneStep 2“

Kann jemand Punkt für mich, was ich fehle?

+1

Fehlende 'var' von' self = this; 'in' EmptyAction() '(was' self' global macht.) – JJJ

+1

@JJJ 'self' [kann bereits global sein] (https: //developer.mozilla. org/de/docs/Web/API/Window/self) abhängig von der Umgebung;) Es überschreibt es tatsächlich. – CodingIntrigue

+0

Yoo sind beide richtig! Danke Jungs! – Juliano

Antwort

0

Wie @JJJ zeigte, habe ich vergessen, die var selbst in der Klasse EmptyAction zu erklären.

Verwandte Themen