Russ Cam dediği gibi, vb birden çok yerde (TinyMCE, komut dosyalarını birleştirerek bu günlerde çok önemlidir genel ad alanını, kirliliğine yol açmaması).
Alex Sexton'ın dediği gibi, iyi bir kod organizasyonu da yapar.
Bu tekniği kullanıyorsanız, modül desenini kullanmanızı öneririm. Bu hala nesne değişmezleri kullanır, ancak bir kapsam işlevinden dönüş değeri olarak:
var MyThingy = (function() {
function doSomethingCool() {
...
}
function internalSomething() {
....
}
function anotherNiftyThing() {
// Note that within the scoping function, functions can
// call each other direct.
doSomethingCool();
internalSomething();
}
return {
doSomethingCool: doSomethingCool,
anotherNiftyThing: anotherNiftyThing
};
})();
Dış kullanım:
MyThingy.doSomethingCool();
kapsam işlevi fonksiyonların her yerinde sarılır ve sonra hemen diyoruz ve dönüş değerini saklayın. Avantajları:
- Fonksiyonlar normalde ilan ve dolayısıyla isimleri sahiptir. (
{name: function() { ... }}
biçiminde iken, tüm işlevleriniz anonimdir, bunlara başvurulan özelliklerin adları olsa bile.) Adlar yardımcı araçlar, bir hata ayıklayıcısındaki çağrı yığınlarını göstererek, hangi işlevi bir istisna attığınızı belirtmenize yardımcı olur. (2015 Güncelleştirmesi: En son JavaScript belirtimi olan ECMAScript 6. sürümünde, JavaScript motorunun değerini bir işlevin adına girmesi gerekir. Bunlardan biri, işlevin bir özelliğe {name: function() { ... }}
örneğindeki gibi atanmasıdır. motorlar ES6 uygular, bu sebeple gider.)
- Size sadece sizin modülünüz tarafından kullanılan özel işlevlere sahip olma özgürlüğü verir (yukarıdaki
internalSomething
gibi). Sayfadaki başka hiçbir kod bu işlevleri çağırmaz; gerçekten özeller. Yalnızca sonuçta dışa aktardığınız, dönüş ifadesinde, kapsam belirleme işlevinin dışında görünür.
- Uygulama tamamen değiştiğinde (örneğin IE-vs-W3C nesneleri veya SVG vs Canvas vb.), Çevreye göre farklı işlevler döndürmeyi kolaylaştırır. farklı işlevler dönüş
Örnek: onlar kodunu düzenlemek için net bir yoldur çünkü
var MyUtils = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent('on' + eventName, handler);
}
function hookViaListener(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
return {
hook: window.attachEvent ? hookViaAttach : hookViaListener
};
})();
MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
Bir işlevi "anonim" şekilde başlattığınızda, yine de bir ad verebilirsiniz (var x = function x() {...}). Bunu yaptığınızda, ad, işlev içindeki özyinelemeli referanslar için kullanılabilir olacak şekilde bağlanır. – Pointy
@Pointy: Bunu (tarayıcıda bir işlev adı kullanın) çapraz tarayıcı yapamazsınız, IE veya Safari'de düzgün çalışmıyor; ayrıntıları: http://yura.thinkweb2.com/named-function-expressions/ Ve gerek yok, fonksiyonun uygun ismi (foo 'foo' foo ') kapsamı tüm kapsamı içinde kapsamı Fonksiyonun kendisi dahil olmak üzere, beyan edilir, bu yüzden foo, 'foo' sembolü ile kendini çağırır, fonksiyon referansını herhangi bir şeye atamaya gerek yoktur (bu noktada). –
(Devam ediyor) Verilerin hem kapsamlama hem de uygun isimleri aynı anda kullanabilmesi için * güzel * olması, işlevlerin kapsam belirleme işlevinden daha kolay aktarılmasını sağlar. Spec kesinlikle buna izin verir, ama ne yazık ki, pratiklikler (uygulama hataları) içine girer. –