2016-12-01 171 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