2016-11-07 5 views
0

私はクロージャの問題があると思っていますが、解決するのに苦労しています。 $ .mapを使用すると問題が発生しないと考えました。おそらくもう1つのJavaScriptクローズ問題

(ZeptoやjQueryの仕事に必要)以下のjavascriptを参照するか、作業コードhttps://jsfiddle.net/rowcp07n/4/アクセス:私は、ログの最後に、「SceneStep 0の完全なハンドラ」を見ることを期待

"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(); 

しかし、誰もが私が欠けているものを私を指すことができます私は

「SceneStep 2の完全なハンドラ」を取得していますか?

+1

'EmptyAction()'の 'self = this;'から 'var'が抜けています(' self'グローバルになります)。 – JJJ

+1

@JJJ 'self' [既にグローバルであるかもしれません](https://developer.mozilla。 org/ja/docs/Web/API/Window/self)を実際に上書きします。 – CodingIntrigue

+0

優はどちらも正しいです!君たちありがとう! – Juliano

答えて

0

@JJJが指摘しているように、私はクラスEmptyActionでvar selfを宣言するのを忘れていました。

関連する問題