Kata -kata sebelumnya
Parameter fungsi JavaScript berbeda dari fungsi di sebagian besar bahasa lain. Fungsi tidak keberatan berapa banyak parameter yang dilewati, juga tidak peduli dengan tipe data parameter yang dilewati, dan mereka bahkan tidak dapat melewati parameter.
argumen
Definisi fungsi dalam JavaScript tidak menentukan jenis parameter fungsi, dan panggilan fungsi tidak melakukan pemeriksaan jenis apa pun pada nilai parameter yang ditularkan. Bahkan, panggilan fungsi JavaScript bahkan tidak memeriksa jumlah parameter formal yang masuk.
fungsi add (x) {return x+1;} console.log (add (1)); // 2console.log (add ('1')); // '11'console.log (add ()); // nanconsole.log (add (1,2)); // 2Parameter formal dengan nama yang sama
Dalam mode non-ketat, parameter formal dengan nama yang sama dapat muncul dalam fungsi, dan hanya parameter formal terakhir dari nama yang muncul dapat diakses
fungsi add (x, x, x) {return x;} console.log (add (1,2,3)); // 3Dalam mode ketat, kesalahan sintaks terjadi ketika nama yang sama terlibat dalam kesalahan sintaksis.
fungsi add (x, x, x) {'gunakan ketat'; return x;} console.log (add (1,2,3)); // sintakser: nama parameter duplikat tidak diizinkan dalam konteks iniJumlah parameter
Ketika jumlah parameter formal yang ditentukan yang dinyatakan oleh fungsi referensi nyata kecil, parameter formal yang tersisa akan diatur ke nilai yang tidak ditentukan
fungsi add (x, y) {console.log (x, y); // 1 tidak ditentukan} add (1);Gunakan logika atau operator sering untuk menetapkan nilai default yang masuk akal untuk parameter yang dihilangkan
fungsi add (x, y) {y = y || 2; console.log (x, y); // 1 2} add (1);[Catatan] Faktanya, menggunakan y || 2 tidak ketat, secara eksplisit menetapkan nilai -nilai palsu (tidak terdefinisi, nol, false, 0, -0, '', Nan) juga akan mendapatkan hasil yang sama. Oleh karena itu, itu harus diatur secara wajar berdasarkan skenario yang sebenarnya
Ketika ada banyak argumen nyata, argumen nyata yang tersisa tidak dapat diperoleh secara langsung. Anda perlu menggunakan objek argumen yang disebutkan segera.
Parameter dalam JavaScript diwakili secara internal oleh array. Fungsi selalu menerima array ini, dan tidak peduli dengan parameter mana yang terkandung dalam array. Array parameter ini dapat diakses melalui objek argumen di badan fungsi, sehingga mendapatkan setiap parameter yang diteruskan ke fungsi. Objek argumen bukanlah contoh array, itu adalah objek array yang dapat mengakses setiap elemennya menggunakan sintaks braket persegi.
fungsi add (x) {console.log (argumen [0], argumen [1], argumen [2]) // 1 2 3Return x+1;} add (1,2,3);Atribut panjang objek argumen menunjukkan jumlah parameter nyata, dan atribut panjang fungsi menunjukkan jumlah parameter formal
fungsi add (x, y) {console.log (argumen.length) // 3return x+1;} add (1,2,3); console.log (add.length); // 2Parameter formal hanya nyaman, tetapi tidak perlu
fungsi add () {return argumen [0] + argumen [1];} console.log (add (1,2)); // 3Parameter objek
Ketika suatu fungsi berisi lebih dari 3 parameter formal, itu benar -benar sakit kepala untuk diingat bahwa urutan yang benar dari parameter aktual dalam fungsi dipanggil.
fungsi arraycopy (/*array*/from,/*index*/form_start,/*array*/to,/*index*/to_start,/*integer*/length) {// todo}Lewati parameter dalam bentuk pasangan nama/nilai, sehingga urutan parameter tidak relevan. Saat mendefinisikan suatu fungsi, parameter yang dilewati dalam nyata ditulis ke dalam objek yang terpisah. Sebuah objek dilewatkan saat dipanggil. Pasangan nama/nilai dalam objek adalah data parameter nyata yang benar -benar diperlukan.
function easycopy (args) {arraycopy (args.from, args.form_start || 0, args.to, args.to_start || 0, args.length);} var a = [1,2,3,4], b = []; easycopy ({Form: a, to: b, b, 4});sinkronis
Ketika jumlah parameter aktual dari formulir yang berpartisipasi dalam bentuk yang sama, nilai objek argumen dan nilai parameter formal yang sesuai tetap disinkronkan
Tes fungsi (num1, num2) {console.log (num1, argumen [0]); // 1 1arguments [0] = 2; console.log (num1, argumen [0]); // 2 2num1 = 10; console.log (num1, argumen [0]); // 10 10} uji (1);[Catatan] Meskipun parameter yang disebutkan dan nilai objek argumen yang sesuai adalah sama, mereka bukan namespace yang sama. Ruang nama mereka independen, tetapi nilainya sinkron
Namun, dalam mode yang ketat, nilai -nilai objek argumen dan nilai -nilai parameter formal independen
Tes fungsi (num1, num2) {'gunakan ketat'; console.log (num1, argumen [0]); // 1 1arguments [0] = 2; console.log (num1, argumen [0]); // 1 2num1 = 10; console.log (num1, argumen [0]); // 10 2} (1) (num1, argumen [0]); // 10 2} (1) (num1, argumen [0]); // 10 2} (1) (num1, argumen [0]); // 10 2} (1) (num1, argumen [0]); //10 2Ketika parameter formal tidak memiliki parameter aktual yang sesuai, nilai objek argumen tidak sesuai dengan nilai parameter formal
tes fungsi (num1, num2) {console.log (num1, argumen [0]); // tidak terdefinisi, tidak terdefinikasinum1 = 10; argumen [0] = 5; console.log (num1, argumen [0]); // 10,5} test ();Sifat internal
【Callee】
Objek argumen memiliki properti yang disebut Callee, yang merupakan penunjuk fungsi yang memiliki objek argumen.
Di bawah ini adalah fungsi faktorial klasik
Function factororial (num) {if (num <= 1) {return 1;} else {return num* factorial (num-1);}} console.log (factororial (5)); // 120Namun, eksekusi fungsi di atas terkait erat dengan nama fungsi, dan fungsi decoupling dapat dihilangkan dengan menggunakan argumen.callee
Function factorial (num) {if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} console.log (faktorial (5)); // 120Namun dalam mode yang ketat, mengakses properti ini akan melempar kesalahan TypeError
fungsi faktorial (num) {'gunakan strict'; if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} // typeError: 'caller', 'callee', dan 'argumen' tidak dapat diakses pada fungsi mode yang ketat atau objek argumen untuk mereka untuk menelepon mereka.Pada saat ini, ekspresi fungsi bernama dapat digunakan
var factorial = function fn (num) {if (num <= 1) {return 1;} else {return num*fn (num-1);}}; Console.log (faktorial (5)); // 120【Penelepon】
Sebenarnya ada dua atribut penelepon
【1】 Fungsi penelepon
Properti penelepon dari fungsi memiliki referensi ke fungsi yang memanggil fungsi saat ini. Jika fungsi saat ini disebut dalam lingkup global, nilainya nol
function outer () {inner ();} function inner () {console.log (inner.caller); // outer () {inner ();}} outer (); function inner () {console.log (inner.caller); // null} inner ();Dalam mode yang ketat, mengakses properti ini akan melempar kesalahan TypeError
function inner () {'gunakan ketat'; // typeError: 'caller' dan 'argumen' adalah properti fungsi terbatas dan tidak dapat diakses dalam konteks ini Console.log (inner.caller);} dalam ();【2】 Argumen Penelepon Objek
Properti ini selalu tidak ditentukan. Properti ini didefinisikan untuk membedakan properti penelepon argumen.caller dan fungsi
function inner (x) {console.log (arguments.caller); // undefined} inner (1);Demikian pula, dalam mode ketat, mengakses properti ini akan melempar kesalahan typeError
fungsi dalam (x) {'gunakan ketat'; // typeError: 'caller' dan 'argumen' adalah properti fungsi terbatas dan tidak dapat diakses dalam konteks iniconsole.log (argumen.caller);} dalam (1);Fungsi berlebih
Fungsi JavaScript tidak dapat menerapkan kelebihan beban seperti dalam arti tradisional. Dalam bahasa lain, dua definisi dapat ditulis untuk suatu fungsi, selama tanda tangan dari dua definisi ini (jenis dan jumlah parameter yang diterima) berbeda
Fungsi JavaScript tidak memiliki tanda tangan karena parameternya diwakili oleh array yang berisi 0 atau lebih nilai. Tanpa tanda tangan fungsi, kelebihan beban nyata tidak mungkin
// Deklarasi selanjutnya mengesampingkan fungsi deklarasi sebelumnya AddSomeNumber (num) {return num + 100;} function addSomeNumber (num) {return num + 200;} var result = addSomeNumber (100); // 300Kelebihan metode hanya dapat disimulasikan dengan memeriksa jenis dan jumlah parameter dalam fungsi yang dilewatkan dan membuat reaksi yang berbeda.
fungsi doAdd () {if (arguments.length == 1) {waspada (argumen [0] + 10);} lain jika (argumen.length == 2) {waspada (argumen [0] + argumen [1]);}} doadd (10); // 20doadd (30.20); // 50Parameter Pass
Semua fungsi dalam JavaScript diteruskan berdasarkan nilai. Dengan kata lain, menyalin nilai di luar fungsi ke parameter di dalam fungsi sama dengan menyalin nilai dari satu variabel ke variabel lainnya
【1】 Nilai tipe dasar
Saat memberikan nilai tipe primitif ke parameter, nilai yang diteruskan disalin ke variabel lokal (elemen dari parameter atau objek argumen bernama)
fungsi addTen (num) {num += 10; return num;} var count = 20; var result = addten (count); console.log (count); // 20, tidak ada perubahan console.log (hasil); // 30【2】 Nilai tipe referensi
Saat melewati nilai jenis referensi ke parameter, alamat nilai ini dalam memori akan disalin ke variabel lokal, sehingga perubahan variabel lokal ini akan tercermin di luar fungsi
function setName (obj) {obj.name = 'test';} var person = objek baru (); setName (orang); console.log (person.name); // 'tes'Ketika parameter formal dari jenis referensi ditimpa di dalam fungsi, variabel ini mengacu pada objek lokal. Objek lokal ini akan dihancurkan segera setelah fungsi dieksekusi
fungsi setName (obj) {obj.name = 'test'; console.log (person.name); // 'test'obj = objek baru (); obj.name =' putih '; console.log (orang.Di atas adalah pemahaman mendalam tentang parameter fungsi JavaScript yang diperkenalkan oleh editor kepada Anda (disarankan). Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!