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の完全なハンドラ」を取得していますか?
'EmptyAction()'の 'self = this;'から 'var'が抜けています(' self'グローバルになります)。 – JJJ
@JJJ 'self' [既にグローバルであるかもしれません](https://developer.mozilla。 org/ja/docs/Web/API/Window/self)を実際に上書きします。 – CodingIntrigue
優はどちらも正しいです!君たちありがとう! – Juliano