2015-04-01 23 views
5

Her zaman JavaScript'de işlevleri bildirmeniz gerektiği söylendi. Bu doğru mu? Bunun avantajı nedir?Neden her zaman JavaScript'te işlevler bildirilir?

var foo = function() {}; 

Ama sözde bu yığın izleme yapmak yanlış, bir şeydir:

Ben genellikle gibi bir değişkene fonksiyonları atar. Birisi açıklayabilir mi lütfen? o bir nesneye atanmış ise

var foo = function fooBar() {}; 

mantıklı misiniz: yapmam söylendi?

var Foo = {}; 
Foo.Bar = function Bar() {}; 

Zihin Eğer bu işlevler küresel kapsamı ne de kendini idam ne de kullanılan birden çok kez içinde değildir.

+4

olası yinelenen [var functionName = fonksiyonu() {} function (vs) {}] (http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname –

+1

Sorunuz, işlevlerin bir ad atamasıyla ilgili gibi görünüyor. Evet, bu yığın izleme ile yardımcı olur, böylece yalnızca bir 'anonim işlev' girdisi göremezsiniz. – JAL

+0

@MikeRobinson, soruların kaldırma hakkında daha fazla olduğunu. Bu iki fonksiyon arasındaki farkı biliyorum. Lütfen soruyu tekrar okuyun. – DevNoob

cevap

3

Her şeyden önce, terminoloji hakkında küçük bir not: sahip olduğunuz bir işlev bildirimi değildir. Bu değişken fooBar erişilebilir fooBar adında bir işlev oluşturur

function fooBar() { 
} 

: Bu fonksiyon beyanıdır.

var foo = function fooBar() { 
}; 

işlevin ismi hala fooBar, ancak işlevi yalnızca değil dışarıda fonksiyonu kendisi ve içinde bir fooBar değişkene bağlıdır: Bu adlandırılmış işlev ifadesi içeren bir atama olduğunu.

  • başvurmak için yeteneği için: o bir dış kapsamında bir değişken başvurmak gerek kalmadan, kapsamı içindeki fonksiyonu erişilebilir hale gelmez gerçeği olsa da, bunun adı iki nedeni vardır demektir dış fonksiyonda koddan bağımsız olarak kendi içinde işlev!

    Bu dış fonksiyon ne isterse dönebilir:

    function fooBar() { 
        return fooBar.toString(); 
    } 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "5" 
    

    Bu tutarlı daima:

    var fooBar = function fooBar() { 
        return fooBar.toString(); 
    }; 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "function fooBar() { …" 
    
  • Ve evet, daha detaylı yığın izleme için:

    function trace(func) { 
        try { 
         func(); 
        } catch (error) { 
         console.log(error.stack); 
        } 
    } 
    
    trace(function() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at /home/ryan/test.js:10:18 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:9:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    
    trace(function descriptiveName() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at descriptiveName (/home/ryan/test.js:14:18) 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:13:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    

    (Burada Node.js resmedilmiştir.) İkinci yığın izinin üstündeki descriptiveName'a dikkat edin. . Bu, özellikle karmaşık olmayan geri çağrılar, olaylar, nesneler üzerinde geçirilen nesneler ve benzeri gibi karmaşık sistemler olduğunda özellikle kullanışlıdır.

arasında
+0

Bir kod bloğunun ne yaptığını tanımlamak için belki de IIFE adını da kullanabilirsiniz. Örneğin. '(function applyFixIfNeeded() {// burada düzeltin}());' yorumlar kullanmaktan ziyade // bu bir kod için geçerlidir. Aslında alt kısımdaki fonksiyonları ilan etmeyi tercih ediyorum ve bunun için en üst sırada çağırıyorum, ama bu formu geçmişte kullandım. – plalx

İlgili konular