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.