错误(很可能)此上下文

时间:2018-12-25 19:46:57

标签: javascript

我对(很可能)的上下文有疑问: 我是JS的新手,更像是c ++家伙。 请查看代码:

controller.js

function CController(){ ... 
    this.myCanvas = new CCanvas(this);
}
CController.prototype.resize() {...}

canvas.js

function CCanvas(_mainController){
    var controller = _mainController;
}
CCanvas.prototype.myEvent(){
    this.controller.resize();  // <--- here!
}

我在提到的那行得到错误,即控制器未定义。 如何纠正?

1 个答案:

答案 0 :(得分:1)

很可能不是范围界定问题。假设您的_mainController实际上是一个控制器(我将在我要向您展示的版本中添加),那么您的问题是在CCanvas的构造函数中,您是在分配var controller,而不是this.controller。反过来,这导致controller被删除(毕竟var是局部变量的关键字。

function CCanvas(_mainController){
    if (!(_mainController instanceof CController)) throw "Not a controller";
    this.controller = _mainController;
}

这应该有效。而且它可以防止您提供非控制器。

如果您确实想像注释中那样坚持下去,并且在类中将变量 not 保留在词法范围内,请执行以下操作:

var CCanvas = function(_mainController) {
  var outputCCanvas = function(){
  };
  outputCCanvas.prototype.myEvent = function(){
     console.log("Event");
  }
  return outputCCanvas;
};

此操作的间接级别太疯狂了,您为此失去了很多 ton 的东西:

  • instanceof上进行CCanvas检查是不可能的,因为每次调用该方法时,每个实例都是动态生成的
  • 哦,是的,您的实例化发生了变化。现在,您正在做new (CCanvas(_mainController))(),因为CCanvas现在是返回类的方法