2016-12-01 175 views
0

http://codepen.io/Lewitje/pen/GjqbbA为什么这个函数声明两次?回调函数在哪里声明?

看着这个,试图弄清楚发生了什么让我气馁。最近我一直在深入研究JavaScript,并且我理解对象,构造函数,原型等等,并且在CSS上,我知道关键帧,画布,坐标等动画,但看着这个我知道也许有40-50%的javascript是写在那里。

1)我知道的类和构造被声明(这是相对较新的JavaScript的?)

2)的jQuery。每个方法用于粘贴标签A1,A2等与setupLabels()

3)各种不同的功能,以显示在表盘上冲的数量,移动臂,移动罐等

现在,这是它得到混乱对我来说:

setPosition(x, y, callback){ 
    $('.hand').on('transitionend',()=>{ 

     $('.hand').off('transitionend'); 

     setTimeout(function(){ 
      callback(); 
     }, 500); 

    }); 

    this.calculateVelocity(x, y, (velX, velY)=>{ 
     $('.arm').css({ 
      'top': (y + 35) + 'px', 
      'transition-duration': velY + 's' 
     }); 

     $('.hand').css({ 
      'left': (x + 5) + 'px', 
      'transition-duration': velX + 's', 
      'transition-delay': velY + 's' 
     }); 
    }); 
} 

calculateVelocity(x, y, callback){ 
    var currentX = $('.hand')[0].offsetLeft; 
    var currentY = $('.arm')[0].offsetTop; 

    var velX = Math.ceil((Math.max(currentX, x) - Math.min(currentX, x))/70); 
    var velY = Math.ceil((Math.max(currentY, y) - Math.min(currentY, y))/70); 

    callback(velX, velY); 
} 
} 

我猜this.calculateVelocity是事实上,调用函数和=之后出现的是定义回调函数?

如果是这种情况,setPosition中的回调如何工作,因为它尚未定义?

回答

0

JavaScript首先编译所有函数名的列表,然后运行,所以calculateVelocity已经定义了。此外,你是正确的,(velX, velY) => {}是回调,并且正在调用该函数。它采用新的Arrow function格式。

下面的两个是相同的:

this.calculateVelocity(x, y, (velX, velY) => { 
    ... 
}); 

this.calculateVelocity(x, y, function(velX, velY) { 
    ... 
}); 

内,this指全局对象。在这种情况下,calculateVelocity是全局对象上的函数,因此可以通过this.calculateVelocity调用它。

我还应该注意,链接的Codepen中的源代码JavaScript实际上是TypeScript/ES7。

+0

嗨,谢谢你的帮助。这个新的Class让我感到困惑,通常我们会使用函数声明一个方法,然后分别调用它,但是在这种情况下,函数前缀甚至不会被使用一次? – kshatriiya

+0

@kshatriiya你能更具体吗? – JosephGarrone

+0

@JsoephGarrone,在上面的代码块中,setPosition(x,y,callback){} 是方法声明。我可以告诉这个方法是在.js文件中的getPosition()方法中调用的。但是通常情况下,如果我们想要定义一个方法,我们可以使用函数setPosition(x,y,callback){}? – kshatriiya