Her Javascript işlevinin bir değer döndürmesi gerekir mi?


100

Her işleve profesyonel bir yorum eklemek için Netbeans kullanıyorum, yazıyorum. Bu yüzden her birine ile başlıyorum /**ve ardından EnterNetbeans'ın aşağıdaki işlev için varsayılan yorum şemasını yerine getirmesine izin vermek için düğmesine basıyorum.

Şimdiye kadar bunu yalnızca PHP dili için kullanıyordum ve bu durumda Netbeans her zaman @returns {type}yalnızca yorum şemasına bir parça ekliyordu , eğer PHP işlevi gerçekten ifade içeriyorsa return. Sözde "prosedürler" (herhangi bir değer döndürmeyen fonksiyonlar) üzerinde bu kısım eksikti.

Bugün Javascript işlevi için aynı şeyi denedim ve Netbeans, @returns {undefined}aşağıdaki işlev hiçbir şey döndürmese de yorum şemasına bir parça ekledi .

Bu kafamı karıştırdı. Netbeans, her Javascript işlevinin herhangi bir şey döndürmesi gerektiğini bu şekilde mi öneriyor? Ne yapmalıyım? Bu yorum şeması bölümünü yok sayın (veya silin) ​​veya öneriyi takip edin (eğer bu bir öneriyse) ve return false;benim için faydasız olsa da, bu tür işlevin sonuna ekleyin .


6
Dönüş değeri belirtilmezse, JavaScript geri dönecektir undefined. Pek çok dilde son ifadenin sonucu döndürülür (daha kullanışlı, IMO). Bunlara örtük getiriler denir .
Zaz

Yanıtlar:


190

Kısa cevap hayır.

Gerçek cevabı evet: JS motoru bazı fonksiyon şey dönen işlevi tarafından yapılır işini, bittiğini haberdar olmak için vardır. Bu aynı zamanda "bitmiş" yerine bir işlevin "geri döndü" denmesinin nedeni de budur .
Döndürme undefineddeğeri olmayan bir C (++) işlevinin söylenmesi (ve imzası bunu yansıtır) gibi, açık bir return ifadesi olmayan bir işlev döndürür void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Ayrıca, çoğu dilde olduğu gibi JS'de de, bir işlevin dönüş değerini basitçe görmezden gelmekte özgürsünüz, ki bu çok büyük bir başarıdır:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

Bazı anda çok düşük seviyede, dönüş atlama çeşit içine çevrilmiştir. Bir işlev gerçekten hiçbir şey döndürmüyorsa , sonraki işlevi neyin ve ne zaman çağıracağını bilmenin veya olay işleyicileri ve benzerlerini çağırmanın hiçbir yolu olmazdı.

Özetlemek gerekirse: Hayır, bir JS işlevinin kodunuzun gittiği sürece hiçbir şey döndürmesine gerek yoktur. Ancak JS motorları söz konusu olduğunda: bir işlev her zaman bir returnifade aracılığıyla veya örtük olarak bir şey döndürür . Bir işlev örtük olarak dönerse, dönüş değeri her zaman tanımsız olacaktır.


5
C ++ (veya C) "nin bir boşluk döndürdüğüne" inanmıyorum. "Void" etiketi hiçbir şey döndürmediğini belirtir. Yine de küçük bir nokta ve sorulan soruyla hiçbir ilgisi yok.
Jay

2
O değil aslında dönmek voidhiçbir şey döndürür, bu imzanın ile bu yansıtır voiddönüş türü.
Elias Van Ootegem

Açık bir getiri veya örtük bir getiri için herhangi bir performans avantajı var mı?
4m1r

@ 4m1r: Bilmiyorum, muhtemelen motora bağlı. Bir performans farkı varsa, büyük olasılıkla ihmal edilebilir. örtük getiri vs return;muhtemelen yalnızca erken dönmeniz gerektiğinde yararlıdır. farklı bir değere çözümlenirse yazmak return undefined;farklı sonuçlar doğurabilir undefined. Tarayıcıların çoğu (hepsi değilse de), tanımsız olarak yeniden atamayı denediğinizde bir hata atar, ancak teoride, node.js kullanan bir örnek mümkündür
Elias Van Ootegem

1
@SebastianLasse: voidBaşka dillerde (C gibi), gibi işlevlere sahip olabileceğiniz void do_someting(int *arg), ancak türe sahip bir değişkeniniz olamaz void. C'de, voidgerçekten bir tür değil, bu yüzden bu işlevler hiçbir şey döndürmüyor , sadece
atlıyorlar

27

Hayır, iade gerekli değildir.

Ama geri dönüş yok aslındaundefined


7

Her Javascript işlevinin bir değer döndürmesi gerekir mi?

Hayır, yok. Spesifikasyonun derinliklerinde, bunların hepsinin biraz farklı olduğu doğrudur :

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... ama sonucu çağıran her biri aynı: undefined. Öyleyse pragmatik terimlerle:

  1. Bir yazmak zorunda değilsiniz, returnkod yürütmenin işlevin "sonundan düşmesine" izin verebilirsiniz.
  2. Dönüyorsan undefined, özellikle, sadece yazarsınreturn;
  3. Bir işlevi ararken, yürütme ile sona erdi, sonunda düştü olmadığını (kod) söyleyemem return;, ya ile sona erdi return undefined;; hepsi arama kodunuza tamamen aynı görünüyor

Spesifikasyona bakın: Spesifik olarak, bir fonksiyonun çalışması sondan düştüğünde, spesifikasyonda "normal" bir tamamlanma olur; ancak return;ve return value;her ikisi de ilişkili bir değere ( undefined) sahip "dönüş" tamamlamalarıdır , ki bu da (çok az da olsa) farklıdır. Ancak aradaki fark, bir işlevi çağırmanın anlambilimiyle ortadan kaldırılır , şöyle ki:

...

  1. Eğer sonucu . [[Tür]] şeklindedir return, NormalCompletion (return sonucu . [[Değer]]).
  2. ReturnIfAbrupt ( sonuç ).
  3. Normal Tamamlanma ( tanımsız ) döndür .

Yani kodda gözlemleyebileceğiniz bir fark yok.


2

Hayır, her işlev için bir şey döndürmeniz gerekmez. İsteğe bağlıdır ve kod mantığınızı nasıl yazdığınıza bağlıdır.

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.