Gittikçe daha fazla ilan edildiğini görüyorum.
var foo = function() {
// things
};
Nasıl öğrendiğim yerine
function foo() {
// things
}
Fark ne? Daha iyi performans? Kapsam? Bu yöntemi kullanmalı mıyım?
Gittikçe daha fazla ilan edildiğini görüyorum.
var foo = function() {
// things
};
Nasıl öğrendiğim yerine
function foo() {
// things
}
Fark ne? Daha iyi performans? Kapsam? Bu yöntemi kullanmalı mıyım?
Yanıtlar:
var foo = function() {}
adsız bir işleve başvuran bir değişkeni tanımlar.
function foo() {}
adlandırılmış bir işlevi tanımlar foo
.
Her ikisi de isimle işlev parametreleri olarak geçirilebilir ve kullanım amacı OOP içinse başlatılabilir.
Günün sonunda, hangisini kullanacağınız, kendi özel kullanım durumunuz tarafından büyük ölçüde belirlenir (Javascript bunun gibi eğlencelidir). Birini kullanmaya başlarsanız , işlevi isimlendirmenizi şiddetle tavsiye ederim:
var foo = function MY_function() {}
. Bu adlandırma kuralı, hata ayıklayıcınızın arama çağrısının işe yaramamasına yardımcı olur.
foo
ve işlev denirMY_function
işlev ifadesi:
//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };
Bu durumda func ifadesi anonimdir ancak başvuru için bir var'a atanır. Bu, etiketli bir işlev ifadesinden aşağıdaki şekillerde farklıdır:
new someFunction().constructor.name === 'someFunction';//false
Örnekler, constructor.name için var adını almaz, çünkü işleve bir başvuru var'a atanır, ancak var, işlev değil, var adına bağlanır.Etiketli bir işlev ifadesinde:
//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
new someFunction().constructor.name === 'someFunction'; //true
isim doğrudan fonksiyona bağlıdır.Genel olarak konuşursak, işlerin etrafta dolaşması durumunda çağrıların başarısız olmasını istemediğiniz veya tek bir satırda bir yöntem tanımladığınız / atadığınız sürece, ifade yapmak için gerçekten büyük bir neden yoktur. Aslında iç func ve altta nesne tanımları olan nesneleri düzenlemek için yararlı buluyorum, böylece nesnenin gerçek davranışına ulaşabiliyorum ve tek satırlı genel yöntem tanımları yapabiliyorum (sadece this.
aynı isimde fonksiyonlar atayarak ). referans kolaylığı için spot. Yapıcılar için IMO etiketli ifadeleri her zaman kullanmaya çalışmalısınız, böylece bir nesnenin 'türünü' yapıcısı aracılığıyla tanımlayabilirsiniz.
İlk örneğiniz bir ifadedir , ikinci örnek ise bir ifadedir . İşlevleri ifadeler olarak tanımlamak, tanımın gerçekleştiği yerde, onu neye atayabileceğiniz, parametre olarak geçirebileceğiniz, vb. Daha fazla esneklik sağlar.
Örneğin:
SomeThing('abc', function(a,b) {return a*b;});
vs...
function tmp(a,b) {
return a*b;
}
SomeThing('abc', tmp);
Daha karmaşık örnekler, fonksiyon ifadesi sözdizimi olmadan çok karmaşık hale gelecektir.
Https://stackoverflow.com/questions/111102/how-do-javascript-closures-work adresine bakın.
Temel pratik fark kaldırmadır. Örneğin:
foo(); // alerts 'hello'
function foo() {alert('hello');}
vs
foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}
Ayrıca, bu tanımsız davranış
function foo(){
if (true) {
function bar(){}
}
bar();
}
bu tamam
function foo(){
if (true) {
var bar = function(){}
}
bar();
}
if
deyim içinde işlev tanımlamasında yanlış bir şey yok!