Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中完全创建变量之前,我似乎在使用它,但这是可行的——为什么?_Javascript_Jquery_Kineticjs - Fatal编程技术网

在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; } );