Return ve return () arasındaki fark nedir?


97
function a() { return 1; }
function b() { return(1); }

Yukarıdaki kodu Chrome konsolunda test ettim ve her ikisi de geri döndü 1.

function c() { return "1"; }
function d() { return("1"); }

Yukarıdaki kodu da test ettim ve her iki fonksiyon da döndü "1".

Öyleyse kullanmak returnve kullanmak arasındaki fark return()nedir?


21
İşte yanıtlar da uygulanır void(x),typeof(x)
Paul S.

3
@ PaulS . — undefinedvoid(0) için bir kısaltma olması gerektiği için her zaman şaşırmıştı . Öyleyse, kısaysa neden gereksiz karakterler ekleyelim? ;-)
RobG

1
@RobG Bunun bir carry-over gelen düşünüyorum Python ve aslında operatörleri dahil etmek istediğiniz özel durumlar için yararlı olabilir void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.


Yanıtlar:


177

Aradakiyle aynı

var i = 1 + 1;

ve

var i = (1 + 1);

Bu hiçbirşey. Parantezlere, herhangi bir ifadede değerlendirme sırasını etkilemelerine izin verildiği için izin verilir, ancak örneklerinizde bunlar gereksizdir.

returnbir işlev değil, bir ifadedir . Sözdizimsel olarak diğer basit kontrol akışı ifadelerine benzer breakve continuebunlar da parantez kullanmaz.


12
Bir dönüş ifadesinin ardından bir ifade gelebilir. Bir dönüş, bir işlevde olmalıdır, bu nedenle işlev, ifadenin değerini döndürür veya yoksa, tanımsız .
RobG

37
@ chris97ong: dönüş bir işlev değildir.
RemcoGerlich

34
returnBir işlevi yaptıysanız , ondan nasıl bir değer döndürürdünüz?
dan04

4
Bu harika bir örnekle birlikte harika bir cevap, ancak bence bu soruya yol açan yanlış anlamanın kökü olduğu düşünüldüğünde, 'dönüş'ün ana cevaba bir işlev olmadığını eklemeye değer olabilir.
BiscuitBaker

3
@BiscuitBaker: Biraz ekledim. Ben bu kısa cevabı aşağı jotted zaman did not ... o 50+ upvotes almak için bekliyoruz
RemcoGerlich

21

Fark yok.

returnbir işlev çağrısı değil, bir dil ifadesidir. Parantezlerle yaptığınız tek şey, dönüş değerinizi değerlendirilebilmesi için gruplamaktır. Örneğin şunları yazabilirsiniz:

return (x == 0);

Bu durumda, x == 0bir boole döndüren trueveya falsedeğerine bağlı olarak ifadenin değerini döndürürsünüz x.


6
return , bir return ifadesinin başlangıcını belirten bir anahtar sözcüktür.
RobG

1
Dönüş ifadesinin değerlendirilmesi "gruplamaya" gerek yoktur. Yani her durumda bir boole dönüşü olacaktır.
Wolf

18

Aslında burada önceliği ()daha yüksektir, bu nedenle önce değerlendirilir:

İşte öncelikle ("1")şu şekilde değerlendirilir:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

bu nedenle yukarıdaki ifade şuna eşdeğerdir:

return "1";

Görsel olarak bakın:

ihlal

Dolayısıyla, temelde işlevsellikte bir fark yoktur, ancak ikincisi, ilk olarak parantezleri çözdüğü için ihmal edilebilir derecede yavaş olabilir.


2
Durum böyle olmadığında neden "ikincisi ihmal edilebilir derecede daha yavaş olabilir" şeklinde tamamen doğrulanmamış bir iddiada bulunuyorsunuz?

9

Kesinlikle hiçbir fark yok. Dönüş ifadesinin JS (ECMAScript) spesifikasyonuna bakarsanız . Diğer birçok şeyin yanı sıra size şunu söylüyor:

return [burada LineTerminator yok] İfade;

ifade sağlayabileceğiniz return. İfade edilir hello, Math.abs(x), yourCustomFunc(7)veya ikinci durumda bu olabilir 1ya (1). 1Değerlendirmeden sonraki ifade , gerçekten tuhaf bir şeyle (1)aynı (((((1))))))ve hatta aynıdır (+(!(+(!1)))).


1
Resmi referans için +1. Sayfa sayfa referans yok mu? - Tek sayfalık HTML çok uzun yükleniyor.
Wolf

@ Kurt böyle bulamadım. İşte bir tane daha, ama aynı zamanda tek sayfalık people.mozilla.org/~jorendorff/…
Salvador Dali

Evet üzücü. Ben de başarılı olamam. Alıntınızı return ifadesinin tüm sözdizimine genişletmeye ne dersiniz?
Wolf

9

Fark yok, parantezler isteğe bağlı. MSDN'ye bakın :

return[(][expression][)];

İsteğe bağlı ifade bağımsız değişkeni, işlevden döndürülecek değerdir. Atlanırsa, işlev bir değer döndürmez.

Bir işlevin yürütülmesini durdurmak ve ifadenin değerini döndürmek için return ifadesini kullanırsınız. İfade atlanırsa veya işlev içinden hiçbir dönüş ifadesi çalıştırılmazsa, geçerli işlevi çağıran ifadeye tanımsız değeri atanır.


8
Yalnızca MS, bir dönüş ifadesinde gruplamayı "isteğe bağlı" yapmayı düşünür . Orada herhangi bir ifadede veya gramerin diğer birçok bölümünde olduğu gibi "isteğe bağlıdır".
RobG

@RobG: Ama görünüşe göre, bir returnaçıklamada sorulmaları çok daha olası . : P MS muhtemelen soruyu JS noobs'dan sormaktan bıktı.
cHao

2
M $ açıklaması yanlış. (), Return deyiminin parçası değildir.
Salman A

4
"Okuyucu için bir fark var." Evet, evet: MSDN belirtimi hatalı bir şekilde bunu ima ediyor return (expressionve return expression)yasal.
Jim Balter

2
@JimBalter Birlikte return (), return (ve return ): P
Paul

9

returnolan bir deyim return ifadesi başlayan bir kelime , değil işlevi.

Bahsedildiği gibi, ekstra parantezler değerlendirme sırasını etkiler, ancak adı verilen işlevi "yürütmek" için kullanılmaz return. Bu satırların sorunsuz çalışmasının nedeni budur:

return (1);
var a = (1);

Aslında bunlar şu satırlarla aynıdır:

return 1;
var a = 1;

Nedeni return()bir sözdizimi hatası kesin nedene olduğunu atar aşağıdaki satırı bir hata atıyor (karşılaştırma için dahil return deyimini):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

Ve bir yan not olarak return, ondan sonra herhangi bir şey içermiyorsa, geri dönmek istediğinizi varsayar undefined.
IQAndreas

@Wolf İfadeler isteğe bağlıdır, bu nedenle returnkendi başına bir dönüş ifadesidir.
Paul

6

İnsanlar için çok büyük, Javascript motoru için sıfır fark var.

return 11 değerini veren fonksiyondan hemen çıkmamız gerektiğini bildiren bir ifadedir .

return(1)Javascript'te parantezlerin dışında boşluk eklemek zorunda olmadığınız aptalca kural tarafından işlev çağrısı olarak gizlenen aynı ifadedir . Üretim sisteminde bunun gibi bir kod kullanırsanız, herhangi bir bakımcı, return()kod tabanında gerçekten bir işleviniz olup olmadığına veya sadece ne olduğunu bilmediğinize karar vermek için biraz zaman harcadıktan sonra, kazık ve meşaleler ile ofisinize gelecektir.return anahtar kelimenin için .

Diğer birçok kişinin zaten doğru bir şekilde söylediği gibi, parantezler sayının harfi harfine yüksek önceliğe sahip "grup" dışında hiçbir şey yapmaz 1.


3
"İnsanlar için çok büyük bir fark var" - Yetkili olanlar değil. "işlev çağrısı olarak gizlenen aynı ifade" - returnişlev yoktur . "Javascript'te parantezlerin dışında boşluk eklemek zorunda olmadığınız aptalca kural" - neredeyse hiçbir dil bunu gerektirmez; buna aptal demek aptalca. "herhangi bir bakıcı, kazığı ve meşalelerle ofisinize gelecektir" - yetkili kimse gelmez. return(1)kötü bir uygulamadır, ancak bu tür şeylere üzülen insanlar kaynaklarını boşa harcıyor ve kötü bir atmosfer yaratıyor.
Jim Balter

@JimBalter "Yetkili olanlar değil" - ha! "Neredeyse hiçbir dil bunu gerektirmez" - bu yüzden "kongre" dedim. Eğer aptalca ise, buna "aptalca" denir. " returnİşlev yok " - tercümanın sizi adla bir işlevi kaydettirmekten men returnetmesi, kod okuyucunun önce akıl sağlığını sorgulamamasına yardımcı olmayacaktır, bu nedenle bu kod boşa gitmektedir. return(1)sadece "kötü uygulama" değil, ne yaptığını bilmeyen birinin tehlikeli bir işaretidir!
2014

2
Yani ya "mecburi" nin ne anlama geldiğini bilmiyorsun, ya da iddianı değiştiriyorsun ... her iki şekilde de zamanımı seninle harcamayacağım.
Jim Balter

Son cümlenin doğruluğundan şüpheliyim; return(bu anahtar kelimeye sahip olduğunu bildiğim tüm dillerde) en az önceliğe sahiptir. Dolayısıyla, isteğe bağlı ifade varsa, her zaman önce değerlendirilir.
Kurt

4

Return ifadesinde, ifadenin etrafındaki parantezler zaten yerleşiktir.

JavaScript'te, diğer birçok dilde (C, C ++, Java, Python gibi) olduğu gibi, return ifadesinin iki bölümü vardır: anahtar kelime returnve (isteğe bağlı) ifade. Yani, her durumda, anahtar kelimeyi izleyen her returnşey önce bir ifade olarak değerlendirilir , bundan sonra, kontrol tekrar arayana iletilerek return ifadesi "çalıştırılır".

Parantez kullanmak ya da kullanmamak bir stil meselesidir , oysa çoğu stil kılavuzu, sorunuzda alıntılananlar gibi önemsiz durumlar için onları yasaklar, çünkü dönüşü yanlış bir şekilde bir işlev gibi gösterir.

Daha sonra ek

Parantezli veya parantezsiz ise, isteğe bağlı ifadeyi returnaynı satırın arkasına , yani aynı satıra yerleştirmeyi asla unutmayın . Gerçek tuzak ile returnondan sonra bir satır sonu ekleyerek JavaScript yalanlarına:

function test() {
  return 
  1;
}

... çünkü yukarıdaki testişlev geri dönecektir undefined.


1

parantez ekleyerek, referans için, javascript'in dönüşten sonra yazılan çoklu ifadelerden önce noktalı virgül eklemediğinden emin olduk: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

örnek :

return a + b;

dönüştürüldü

return; a + b;

ASI tarafından.

Konsol, "dönüş ifadesinden sonra ulaşılamayan kodu" uyaracaktır. Bu sorunu önlemek için (ASI'yi önlemek için) parantez kullanabilirsiniz:

return ( a + b );
kod kopyalandı: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


Bu kesinlikle doğrudur ve bu şekilde karmaşık ifadeler için mantıklıdır. Ama daha net hale getirmek için ilk cümlede aynı satıra veya doğrudan dönüşün arkasına eklemelisin . Olumsuz oylamanın bunun yanlış yorumlanmasından kaynaklandığını düşünüyorum.
Wolf
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.