可能是另一个Javascript关闭问题

时间:2016-11-07 14:49:05

标签: javascript

我认为我有一个关闭问题,但我很难尝试解决它。 我认为使用$ .map会阻止任何问题。

请参阅下面的javascript(需要使用Zepto或jQuery)或访问工作代码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();

我希望在日志结束时看到“SceneStep 0的完整处理程序” 但我得到“SceneStep 2的完整处理程序”

有人能指出我缺少的东西吗?

1 个答案:

答案 0 :(得分:0)

正如@JJJ指出的那样,我忘了在类EmptyAction中声明var self。