İşlev bildirimi işlev yerine var olarak


28

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?


Javascript'te işlevlerin birinci sınıf vatandaş olduğunu belirtmekte fayda var . Bu, davranışları tıpkı nesneler gibi dolaşmanızı sağlar. Bu, diğer şeylerin yanı sıra geri aramalar ve delegasyon için çok kullanışlıdır.
Chris Bye,

Kapsam . "// Şeyleri" sarmalayan değişken ismi, esasen / ümitle, içerdiği diğer JavaScript (dosyalar) ile birlikte "// Şeylerin" isim çarpışmalarını engelliyor. Bunu düşünmenin bir başka yolu da "foo" ad alanı yaratmış olmanız.
radarbob

Yanıtlar:


25

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.


1
İşlev () MY orada goof var ...
Erik Reppen

1
@Demian Brecht, peki ya var foo = function foo () {...} yaklaşımı?
saat

@ shabunc: Peki ya bu? Cevabımın son paragrafında listelenmiştir.
Demian Brecht

@Demian Brecht, hayır, aslında son paragrafta değişken denir foove işlev denirMY_function
shabunc

@ shabunc: Adı önemli değil. Önemli olan görüşme listesindeki değerdir. Örnek olarak, [NAMESPACE] _ [fn name] Mozilla tarafından kullanılan kuraldır. Bu adın kendisi, kongre projeniz boyunca tutarlı olduğu sürece önemli değildir.
Demian Brecht

13

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:

  • kaldırılamaz (tanımlanmadan önce çağırılı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'); }
  • kaldırma işleri
  • 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.


8

İ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.


4

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();
}

7
JS'de bir fonksiyonun içinde bir fonksiyon tanımlamakta kesinlikle yanlış bir şey yoktur. JS'de işlev tanımlayamadığınız pek fazla yer yok.
Erik,

2
@ErikReppen İşlevsel olmayan bloklar içindeki işlev bildirimlerini kesinlikle kullanamazsınız (bir if ifadesinde olduğu gibi). Nerede okuduğumu başka bir işlevde kullanılamayacaklarını bulamıyorum.
Austin

@Austin Bir ifdeyim içinde işlev tanımlamasında yanlış bir şey yok!
Tim,

@ Austin: Belki de w3schools de okudun? ;)
Demian Brecht

2
@ErikReppen İşlev ifadeleri her yerde kullanılabilir. İşlev bildirimleri olamaz. Bkz stackoverflow.com/questions/10069204/...
Austin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.