Anonim işlev ifadesi durumunda, işlev anonimdir - tam anlamıyla adı yoktur. Ona atadığınız değişkenin bir adı var, ancak işlev yok. (Güncelleme: Bu ES5 aracılığıyla doğruydu. ES2015'ten itibaren [ES6 olarak da bilinir], genellikle anonim bir ifadeyle oluşturulan bir işlev gerçek bir ad alır [ancak otomatik bir tanımlayıcı değil], okumaya devam edin ...)
İsimler kullanışlıdır. İsimler yığın izlerinde, çağrı yığınlarında, kesme noktası listelerinde vb. Görülebilir. İsimler bir İyi Şeydir ™.
(Eskiden IE'nin eski sürümlerinde [IE8 ve altı] adlandırılmış işlev ifadelerine dikkat etmeniz gerekirdi, çünkü bunlar yanlışlıkla iki tamamen farklı zamanda tamamen ayrı iki işlev nesnesi oluşturdular [blog makalemde daha fazlası Double take ]. Gerekirse IE8 [!!] desteği, muhtemelen anonim işlev ifadelerine veya işlev bildirimlerine bağlı kalmak en iyisidir , ancak adlandırılmış işlev ifadelerinden kaçının.)
Adlandırılmış bir işlev ifadesiyle ilgili önemli bir şey, işlev gövdesi içindeki işlev için bu adla bir kapsam içi tanımlayıcı oluşturmasıdır:
var x = function example() {
console.log(typeof example);
};
x();
console.log(typeof example);
Ancak ES2015'ten itibaren, birçok "anonim" işlev ifadesi adlarla işlevler oluşturur ve bu, çeşitli modern JavaScript motorlarının adların bağlamdan çıkarılması konusunda oldukça akıllı olmasından önce yapılmıştır. ES2015'te, anonim işlev ifadeniz adıyla bir işlevle sonuçlanır boo
. Bununla birlikte, ES2015 + anlambilimiyle bile, otomatik tanımlayıcı oluşturulmaz:
var obj = {
x: function() {
console.log(typeof x);
console.log(obj.x.name);
},
y: function y() {
console.log(typeof y);
console.log(obj.y.name);
}
};
obj.x();
obj.y();
Fonksiyonun adının atanması , spesifikasyondaki çeşitli işlemlerde kullanılan SetFunctionName özet işlemi ile yapılır .
Kısa sürüm, temelde, bir atama veya başlatma gibi bir şeyin sağ tarafında anonim bir işlev ifadesi göründüğünde, örneğin:
var boo = function() { };
(ya da olabilir let
ya da const
yerine var
) , ya da
var obj = {
boo: function() { }
};
veya
doSomething({
boo: function() { }
});
(bu son ikisi gerçekten aynı şeydir) , ortaya çıkan işlevin bir adı olacaktır ( boo
örneklerde).
Önemli ve kasıtlı bir istisna vardır: Var olan bir nesne üzerindeki bir özelliğe atama:
obj.boo = function() { };
Bunun nedeni, yeni özellik eklenme sürecinden geçerken ortaya çıkan bilgi sızıntısı endişeleriydi; Burada başka bir soruya verdiğim cevabın ayrıntıları .