Apa yang terjadi jika saya tidak meneruskan parameter dalam fungsi Javascript?


90

Saya baru mengenal dunia Javascript dan saya mengutak-atik penulisan fungsi yang sangat mendasar dan tersandung pada contoh di bawah ini secara tidak sengaja dan saya tidak yakin mengapa itu berfungsi ketika saya tidak melewati parameter ketika fungsi menuntutnya.

Fungsi sampel

function myfunction(x) {
    alert("This is a sample alert");
}

Sekarang jika saya memanggil fungsi tersebut, myfunction();saya diberikan peringatan. Mengapa saya bisa memanggil fungsi tanpa kesalahan atau peringatan ketika saya belum memberikan parameter?

EDIT

Saya tidak mengharapkan begitu banyak jawaban yang bagus dan saya sama sekali tidak dalam posisi untuk mengatakan jawaban mana yang terbaik, jadi saya bisa meminta orang untuk menyarankan jawaban terbaik dan saya akan memberikan penerimaan kepada orang itu.



2
Tidak ada kelebihan beban berdasarkan tanda tangan fungsi di JS sehingga benar-benar tidak peduli berapa banyak parameter yang "diharapkan" oleh fungsi. Anda bahkan dapat mengirimkan parameter yang tidak ditentukan oleh fungsi dan hanya menggunakan argumen kata kunci untuk mengambilnya.
scrappedcola

@scrappedcola - Apa yang Anda maksud dengan overloading serta meneruskan parameter yang fungsi tidak ditentukan untuk diambil? Bisakah Anda memberi contoh?
KacangMonkey

2
@Peanuts. Maksudnya, Anda tidak dapat memiliki dua fungsi: function foo(x){...}dan function foo(x,y,z){...}Anda hanya dapat memiliki satu fungsi untuk setiap nama.
gdoron mendukung Monica

2
@Peanuts. Ya, Anda tidak dapat memiliki function overloadingdi js, Anda memiliki cara lain untuk mengejeknya.
gdoron mendukung Monica

Jawaban:


114

Tidak ada yang akan terjadi- artinya Anda tidak akan mendapatkan kesalahan atau peringatan karena meneruskan parameter dalam javascript bersifat opsional.
Semua parameter yang tidak "diberikan" akan memiliki undefinednilai .

function foo(x, y, z){
    //...
}

foo(1);

Di dalam foofungsinya sekarang:

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

Anda bahkan dapat memberikan lebih banyak argumen, seperti:

foo(1,2,3,4,5,7); // Valid!

Anda dapat mengetahui jumlah parameter yang disediakan arguments.lengthdari dalam fungsi.

function foo(x, y, z) {
    console.log('x value: ' + x);
    console.log('y value: ' + y);
    console.log('z value: ' + z);
    console.log('Arguments length: ' + arguments.length);
}
console.log('Zero parameters');
foo();
console.log('Four parameters');
foo(1, 2, 3, 4);

Contoh fungsi berguna yang menangani sejumlah parameter:

function max() {
    var maxValue = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        if (maxValue < arguments[i]) {
            maxValue = arguments[i];
        }
    }
    return maxValue;
}

alert(max(1, 5, 7, 2, 88, 32, 44));


Terima kasih untuk demo langsungnya. Tidak mengharapkan begitu banyak jawaban yang bagus. Jadi jika saya memiliki fungsi seperti function myfunction (a,b){}dan lulus nilai myfungsi (1,2,3,4,5), apakah itu masih valid? Apakah ekspektasi akan ada peringatan atau kesalahan?
PeanutsMonkey

Maaf, maukah Anda menjelaskan apa yang dilakukan perintah console.logserta arguments.length?
PeanutsMonkey

@Peanuts. Sah! tidak ada peringatan tidak ada kesalahan, itu akan berguna, saya akan memberikan demo sebentar lagi.
gdoron mendukung Monica

1
@Peanuts. Ia bekerja dengan IE juga jika Anda menginstal konsol pengembang, saya pikir itu diinstal secara default dari IE8 +. Saya tidak mengerti apa yang Anda tulis alert.
gdoron mendukung Monica

1
@Peanuts. 1. Anda tidak dapat memiliki kode setelah returndiabaikan. 2. Anda tidak akan mendapatkan kesalahan atau peringatan. Lihat DEMO ini
gdoron mendukung Monica

10

Semua argumen dalam fungsi JavaScript bersifat opsional (baca "diketik secara longgar").

Fungsi JavaScript dapat dipanggil dengan sejumlah argumen, berapa pun jumlah argumen yang disebutkan dalam definisi fungsi. Karena suatu fungsi diketik secara longgar, tidak ada cara untuk mendeklarasikan jenis argumen yang diharapkannya, dan legal untuk meneruskan nilai jenis apa pun ke fungsi apa pun. Ketika sebuah fungsi dipanggil dengan lebih sedikit argumen daripada yang dideklarasikan, argumen tambahan memiliki nilai yang tidak ditentukan.

Anda bisa merujuk ke argumen fungsi di dalam fungsi dengan menggunakan variabel argumen bernama atau objek argumen. Objek ini berisi entri untuk setiap argumen yang diteruskan ke fungsi, indeks entri pertama dimulai dari 0. Misalnya, jika sebuah fungsi melewati tiga argumen, Anda bisa merujuk ke argumen sebagai berikut:

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - Panduan Definitif, Edisi ke-5

7

Begitulah cara kerja JavaScript. Parameter bersifat opsional, dan akan memiliki nilai yang tidak benar-benar bernilai "tidak ditentukan" dalam fungsi jika tidak ada dalam panggilan fungsi.

Yang saya maksud dengan "opsional" adalah: menjalankan fungsi apa pun melibatkan daftar parameter yang panjang dan sewenang-wenang. Tidak perlu ada hubungan antara jumlah parameter yang diteruskan ke suatu fungsi dan jumlah yang dideklarasikan . Cara terbaik untuk memikirkan deklarasi ini, maka:

function x(a, b, c) {
  // ...
}

adalah bahwa Anda mendeklarasikan fungsi dan mengikat nama "a" ke parameter pertama, "b" ke parameter kedua, dan "c" ke parameter ketiga. Namun, itu sama sekali tidak dijamin bahwa salah satu dari mereka akan benar - benar terikat ke nilai dalam pemanggilan fungsi tertentu nanti.

Dengan token yang sama, Anda dapat menentukan fungsi tanpa parameter sama sekali, lalu "menemukannya" melalui argumentsobjek:

function noArgs() {
  var a = arguments[0], b = arguments[1], c = arguments[2];
  // ...
}

Jadi itu tidak persis sama dengan fungsi pertama, tetapi hampir dalam banyak hal yang dihitung secara praktis.

Nilai "tidak ditentukan" di JavaScript adalah sebuah nilai, tetapi semantiknya agak tidak biasa seiring perkembangan bahasa. Secara khusus itu tidak persis sama dengan nullnilainya. Selain itu, "tidak ditentukan" itu sendiri bukanlah kata kunci; itu hanya nama variabel semi-khusus!


Bisakah Anda menjelaskan lebih jauh apa yang Anda maksud dengan nilai optional"bukan nilai sebenarnya" undefined?
PeanutsMonkey

@PeanutsMonkey - Jika variabel tidak diberikan, maka akan diberikan undefined.
Derek 朕 會 功夫

@ Pointy - Apa yang Anda maksud dengan tidak ada jaminan bahwa salah satu parameter yang dideklarasikan akan benar-benar terikat ke suatu nilai?
PeanutsMonkey

1
@PeanutsMonkey JavaScript adalah bahasa dinamis . Saat memanggil suatu fungsi, deklarasi fungsi tersebut tidak penting, termasuk jumlah parameternya. Dengan demikian, Anda dapat mendeklarasikan fungsi dengan parameter sebanyak yang Anda suka, tetapi tidak ada batasan pada berapa banyak parameter yang sebenarnya diteruskan saat fungsi Anda dipanggil. (Dengan cara itu, ini semacam C, setidaknya C di masa lalu.) Jadi, jika Anda mendeklarasikan parameter dan panggilan dibuat tanpa nilai parameter apa pun yang diberikan, parameternya adalah undefined.
Pointy

3

JavaScript tidak memiliki nilai default untuk parameter fungsi seperti bahasa lain. Jadi, Anda dapat menyampaikan argumen sebanyak atau sesedikit yang Anda inginkan.

Jika Anda tidak meneruskan nilai, parameternya adalah undefined.

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

Jika Anda mengirimkan lebih banyak parameter daripada yang ada di tanda tangan, Anda dapat menggunakan arguments.

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]

Terima kasih. Daripada posting silang, dapatkah Anda melihat contoh saya yang saya berikan kepada David Thomas karena saya masih mendapatkan kesalahanundefined
PeanutsMonkey

@ Kacang Kacang: Hah? Apa masalah Anda?
Roket Hazmat

Bukan masalah itu sendiri. Saya mengacu pada pertanyaan tindak lanjut saya kepada David tentang menyampaikan lebih banyak parameter yang telah Anda sertakan dalam jawaban Anda. Apa yang saya tidak begitu ikuti adalah apa yang Anda maksud logs? Di mana itu mencatatnya?
PeanutsMonkey

1
@PeanutsMonkey: Ini mencatatnya ke "konsol JavaScript" Anda. Di sebagian besar browser, Anda dapat menekan F12atau Ctrl+Shift+Juntuk mengaksesnya.
Roket Hazmat

1
Kalimat pertama sudah tidak berlaku sejak ES2015 ...
Heretic Monkey

2

Anda juga bisa memberikan lebih banyak argumen daripada hanya yang disebutkan dalam fungsi

myFunction(1,2,3,4,5,6,7,'etc');

Anda dapat menggunakan argumentsproperti berupa array untuk melihat argumen yang diberikan.


Argumen @albert bukan arraynya seperti objek lihat
Mahi

1

Karena tidak ada kesalahan hingga fungsi tersebut diharapkan dapat bekerja dengan parameter yang seharusnya Anda teruskan.

Sebagai contoh:

function myfunction(x) {
    return x*2;
}

Akan menimbulkan kesalahan; meskipun mungkin hanya a NaN(dalam kasus ini) atau a variable is undefined.


Oke, selama saya tidak mereferensikan parameter dalam fungsi, saya tidak akan mendapatkan kesalahan? Apakah itu benar?
KacangMonkey

Sekarang jika saya menguraikan contoh yang Anda berikan yaitu function myfunction(a,b) { var calc = a+b; return;}dan kemudian memanggil fungsi document.write(myfunction(1.2));mengapa saya masih mendapatkan nilai undefinedmeskipun saya meneruskan parameter?
PeanutsMonkey

1
Karena Anda tidak mengembalikan apa pun. Anda harus secara eksplisit, dalam contoh Anda, mengembalikan nilai: baik return calc; atau return a+b;(sebagai baris terakhir, jelas; dan yang terakhir returnmenggantikan var calc).
David mengatakan mengembalikan Monica

Jadi maksud Anda saya tidak perlu mendeklarasikan variabel jika saya melakukannya return a+b;?
PeanutsMonkey

@PeanutsMonkey - Anda dapat membaca lebih lanjut di return sini .
Derek 朕 會 功夫

0

Jika Anda menghilangkan argumen, nilainya akan menjadi undefined. Ini memungkinkan Anda membuat parameter opsional dengan cukup mudah.

Fitur lainnya adalah kemampuan untuk mendefinisikan fungsi tanpa parameter, dan memanggilnya dengan argumen dengan sukses, memanfaatkan argumentsobjek tersebut. Ini memungkinkan Anda dengan mudah membuat array argumen dengan panjang variabel.


0

Dalam javascript console.log di dalam fungsi memberikan tidak terdefinisi sebagai keluaran untuk parameter yang tidak dilewati tetapi di luar fungsi itu memberikan kesalahan yang tidak ditentukan karena di dalam fungsi browser secara eksplisit mendeklarasikan variabel. Misalnya

console.log(x) 

memberikan VM1533: 1 Uncaught ReferenceError: x tidak didefinisikan sedangkan

function test(x) {
console.log(x)
}
test(); 

memberikan undefined. Itu karena function test () ditulis ulang oleh browser sebagai:

function test(x) {
    var x;
    console.log(x)
    }

Contoh lain : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

masih belum ditentukan saat fungsinya menjadi

function test(x) {
    var x;
    console.log(x)
    }

Lansiran dalam contoh di bawah ini akan memberikan tidak terdefinisi: -

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

Fungsi di atas akan menjadi: -

 function test() {
    var x;
    alert(x);
    x =10;
    }

Cakupan variabel javascript di dalam suatu fungsi adalah cakupan level fungsi dan bukan level blok. Misalnya

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

akan memberikan keluaran sebagai:

j is 5 
i is 10

Sekali lagi fungsinya menjadi: -

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.