在Javascript中完全创建变量之前,我似乎在使用它,但这是可行的——为什么?
有人能给我解释一下吗在Javascript中完全创建变量之前,我似乎在使用它,但这是可行的——为什么?,javascript,jquery,kineticjs,Javascript,Jquery,Kineticjs,有人能给我解释一下吗 var diagramImage = new Kinetic.Shape(function () { var context = this.getContext(); context.beginPath(); context.lineWidth = 1; //This is crazy tricks. It's part of the KineticJS demo website, but how am I able to assign di
var diagramImage = new Kinetic.Shape(function () {
var context = this.getContext();
context.beginPath();
context.lineWidth = 1;
//This is crazy tricks. It's part of the KineticJS demo website, but how am I able to assign diagramImage.color here?
context.strokeStyle = diagramImage.color;
var lastVertice = polygon.Vertices[polygon.Vertices.length - 1];
context.moveTo(lastVertice.X, lastVertice.Y);
for (var i = 0; i < polygon.Vertices.length; i++) {
var vertice = polygon.Vertices[i];
context.lineTo(vertice.X, vertice.Y);
}
context.stroke();
context.closePath();
});
因为调用
diagramage.color
的位置在传递给Kinetic.Shape
构造函数的闭包/函数中。在构造函数创建的新实例分配给diagramImage
之前,构造函数不会调用/执行此函数
下面是一个最简单的例子,可以更好地解释发生了什么:
var MyObject = function(f){
this.myFunc = f; // f is executed sometime later...
};
MyObject.prototype.execute = function(){
this.myFunc();
};
var myObjInst = new MyObject(function(){
console.log("myObjInst:", myObjInst);
});
myObjInst.execute();
正如Twisol所指出的,这可以通过使用this
来改进。例如:
(function(){
var MyObject = function(f){
this.myFunc = f; // f is executed sometime later...
};
MyObject.prototype.execute = function(){
this.myFunc();
};
var myObjInst = new MyObject(function(){
console.log("myObjInst:", this);
});
myObjInst.execute();
})();
然而,正如Chris所指出的,除非API有文档记录,否则不能保证此
在回调期间将引用motional.Shape
,因此继续使用diagramage
可能仍然是这两个选项中更好的一个
简而言之,我认为这不是最好的API /示例/使用JavaScript——我不认为这是一个你必须处理的JavaScript的细微差别。当然,如果你需要的话,这些细微差别是存在的——但你不必如此。我认为这篇文章可能有助于解释它- 特别是有关关联数组的部分。本文解释了javascript中的对象也被视为关联数组 因此,尽管事件
diagrammage.strokeStyle
可能没有明确定义,但您仍然可以引用diagrammage['strokeStyle']
这有用吗?这是一个有趣的结构。发生的情况似乎是:
是一个引用,在它仅仅凭借声明被分配任何内容之前。要将此可视化,请想象diagramImage
本身位于前一行var diagramige
接受一个回调,即匿名函数,作为其构造函数参数之一,供以后使用Kinetic.Shape
- 回调要引用
对象。大概有一些契约描述了Kinetic.Shape
稍后引用的内容(如this
使用所示),而它不是this.getContext()
对象动能.Shape
- 因为
是一个参考,并且在使用该参考时,它将被分配新的diagramage
,因此将其用于上述目的是合乎犹太教义的Kinetic.Shape
var self = this;
$('myelement').click( function(){ self.hi = true; } );
只是在这里,以后可用的变量不是当前对象,它是上述对象的一个成员。在您包含的这部分代码之前是否已经定义了
diagramage
?否。请参阅本教程:它们对变量“center”执行相同的操作您是否可以发布其他代码来证明您的断言?是否有任何方法可以使此代码更。。。直觉的或者这是Javascript的细微差别,我必须学会去喜欢它吗?:)来源(字面意思)drawFunc
既不在Kinetic.Shape
中调用,也不在Kinetic.Node
中调用,但它被称为drawFunc
并作为属性保留的事实说明了这一点。@SeanAnderson:是的,在函数中使用this
,而不是diagramImage
。这里可以这样做,因为在调用drawFunc
的地方,它提供了正确的对象作为this
@ziesemer:您的第一个示例也为我打印了myObjInst:undefined
。在这两种情况下,您都是从构造函数中调用提供的方法,这不是Kinetic.js所做的-它会存储它以备将来使用。@Twisol-抱歉,我过度简化了我的示例。为了反映这一点,对答案进行了调整。
var self = this;
$('myelement').click( function(){ self.hi = true; } );