2011-12-30 11 views
2

これはばかげています...なぜこの関数を呼び出せないのですか?

私はこれを行うときにエラーが発生します。

#...codecodecode... 

g = generateGuid() 

#...codecodecode... 

generateGuid = -> 
    "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace /[xy]/g, (c) -> 
    r = Math.random() * 16 | 0 
    v = (if c is "x" then r else (r & 0x3 | 0x8)) 
    v.toString 16 

私がやりたいすべてはあなたがそれが定義されています前に、関数を呼び出すしようとしている...

+1

がポストにエラーメッセージ/詳細を含めるだけでなく、希望のより該当タイトルと説明を選択してください動作。 –

答えて

5

ドリームは正しいです。彼の答えに展開するには:あなたは(たとえその定義の前に)その範囲内のどこからでもgenerateGuidを呼び出すことができますJavaScriptのイディオム

function generateGuid() { ... } 

に使用することができます。 CoffeeScriptはこれをしません。代わりに、それは

var generateGuid = function() { ... } 

にコンパイルこれを行うにはいくつかの理由がありますが、長いとそれの短いの機能は、他のすべての変数と同じスコープ規則に従うということです。 generateGuidに値が割り当てられる前に、を呼び出そうとするのはgenerateGuid()です。

注非同期コールバックがJavaScriptで作業方法によることが、これは動作します:

3

をプライベート関数を呼び出すです。 This works:場合

#...codecodecode... 

#...codecodecode... 

generateGuid = -> 
    "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace /[xy]/g, (c) -> 
    r = Math.random() * 16 | 0 
    v = (if c is "x" then r else (r & 0x3 | 0x8)) 
    v.toString 16 

g = generateGuid() 

これはあなたに驚くべきことである、のCoffeeScriptはJavaScriptにコンパイルすることを忘れないでください - 実際に、それはいくつかのJavascriptの上にシンタックスシュガーよりもはるかにではありません。 Javascriptで適用されるほとんどのルールは、Coffeescriptでも当てはまります。

+1

を除いて、javascriptでは関数が定義される前に関数を呼び出すことはできません。 –

関連する問題