Rumah > hujung hadapan web > tutorial js > Argumen: Keanehan JavaScript

Argumen: Keanehan JavaScript

Joseph Gordon-Levitt
Lepaskan: 2025-03-08 00:23:12
asal
613 orang telah melayarinya

3

Takeaways Key arguments: A JavaScript Oddity

Argumen 'adalah objek tempatan, seperti array yang terdapat di dalam setiap fungsi JavaScript, yang mengandungi semua argumen yang dibekalkan kepada fungsi apabila ia dipanggil. Ia bukan array yang benar, kerana ia tidak mempunyai kaedah array standard seperti Push and Pop. Argumen: Keanehan JavaScript

Walaupun batasannya, 'argumen' adalah alat yang berkuasa, yang membolehkan penciptaan fungsi fleksibel yang menerima bilangan argumen yang berubah -ubah, yang boleh ditukar kepada array sebenar menggunakan kaedah array, slice.

Argumen 'juga mempunyai harta' Callee 'yang mengandungi rujukan kepada fungsi yang mencipta objek' Argumen ', yang membolehkan fungsi tanpa nama untuk merujuk kepada dirinya sendiri. Ini boleh digunakan untuk mewujudkan fungsi rujukan sendiri dan fungsi dengan argumen pratetap.
  • Argumen adalah nama objek tempatan, seperti array yang terdapat di dalam setiap fungsi. Ia unik, sering diabaikan, tetapi sumber pengaturcaraan banyak pengaturcaraan; Semua perpustakaan utama JavaScript memanfaatkan kuasa objek Argumen. Ia adalah sesuatu yang setiap pengaturcara JavaScript harus menjadi biasa.
  • Di dalam mana -mana fungsi anda boleh mengaksesnya melalui pembolehubah: argumen, dan ia mengandungi pelbagai argumen yang dibekalkan kepada fungsi apabila ia dipanggil. Ia sebenarnya bukan pelbagai JavaScript; Typeof Argumen akan mengembalikan nilai: "Objek". Anda boleh mengakses nilai argumen individu melalui indeks array, dan ia mempunyai harta panjang seperti tatasusunan lain, tetapi ia tidak mempunyai kaedah array standard seperti push and pop.
  • Buat fungsi fleksibel

Walaupun ia mungkin kelihatan terhad, hujah adalah objek yang sangat berguna. Sebagai contoh, anda boleh membuat fungsi yang menerima bilangan argumen yang berubah -ubah. Fungsi format, yang terdapat di Perpustakaan Base2 oleh Dean Edwards, menunjukkan fleksibiliti ini:

Anda membekalkan rentetan templat, di mana anda menambah pemegang tempat untuk nilai menggunakan %1 hingga %9, dan kemudian membekalkan sehingga 9 argumen lain yang mewakili rentetan untuk dimasukkan. Contohnya:

kod di atas akan mengembalikan rentetan "dan kertas ingin tahu baju yang anda pakai".

Satu perkara yang mungkin anda perhatikan ialah, dalam definisi fungsi untuk format, kami hanya menetapkan satu hujah: String. JavaScript membolehkan kita lulus beberapa argumen ke fungsi, tanpa mengira definisi fungsi, dan objek argumen mempunyai akses kepada mereka semua.
function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

menukarnya ke array sebenar

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
Salin selepas log masuk
Salin selepas log masuk
Walaupun argumen bukanlah array JavaScript yang sebenarnya, kita dapat dengan mudah menukarnya kepada satu dengan menggunakan kaedah array standard, slice, seperti ini:

Args pembolehubah kini akan mengandungi objek array JavaScript yang sesuai yang mengandungi semua nilai dari objek argumen.

Buat fungsi dengan argumen pratetap

Objek Argumen membolehkan kita melakukan segala macam helah JavaScript. Berikut adalah definisi untuk fungsi Makefunc. Fungsi ini membolehkan anda membekalkan rujukan fungsi dan bilangan argumen untuk fungsi tersebut. Ia akan mengembalikan fungsi tanpa nama yang memanggil fungsi yang anda tentukan, dan membekalkan argumen pratetap bersama -sama dengan sebarang argumen baru yang dibekalkan apabila fungsi tanpa nama dipanggil:

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Hujah pertama yang dibekalkan kepada Makefunc dianggap sebagai rujukan kepada fungsi yang anda ingin panggil (ya, tidak ada ralat pemeriksaan dalam contoh mudah ini) dan ia dikeluarkan dari argumen argumen. Makefunc kemudian mengembalikan fungsi tanpa nama yang menggunakan kaedah penerapan objek fungsi untuk memanggil fungsi yang ditentukan.

hujah pertama untuk memohon merujuk kepada skop fungsi akan dipanggil; Pada dasarnya apa kata kunci yang akan dirujuk di dalam fungsi yang dipanggil. Itu agak maju buat masa ini, jadi kami hanya menyimpannya. Hujah kedua adalah pelbagai nilai yang akan ditukar kepada objek Argumen untuk fungsi tersebut. Makefunc menyambungkan pelbagai nilai asal ke pelbagai argumen yang dibekalkan kepada fungsi tanpa nama dan membekalkannya kepada fungsi yang dipanggil.

Katakan ada mesej yang anda perlukan untuk mengeluarkan di mana templat selalu sama. Untuk menjimatkan anda dari selalu perlu mengutip templat setiap kali anda memanggil fungsi format, anda boleh menggunakan fungsi utiliti Makefunc untuk mengembalikan fungsi yang akan memanggil format untuk anda dan mengisi argumen templat secara automatik:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
Salin selepas log masuk
Salin selepas log masuk

anda boleh memanggil fungsi majortom berulang kali seperti ini:

var args = Array.prototype.slice.call(arguments);
Salin selepas log masuk

Setiap kali anda memanggil fungsi Majortom ia memanggil fungsi format dengan hujah pertama, templat, sudah diisi. Panggilan di atas kembali:

function makeFunc() {
  var args = Array.prototype.slice.call(arguments);
  var func = args.shift();
  return function() {
    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
  };
}
Salin selepas log masuk

Buat fungsi rujukan diri

Anda mungkin berfikir yang cukup keren, tetapi tunggu, hujah -hujah mempunyai satu lagi kejutan; Ia mempunyai satu lagi harta yang berguna: Callee. Argumen.Callee mengandungi rujukan kepada fungsi yang mencipta objek Argumen. Bagaimana kita boleh menggunakan perkara sedemikian? argumen.callee adalah cara yang berguna fungsi tanpa nama dapat merujuk kepada dirinya sendiri.

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");
Salin selepas log masuk
majorTom("stepping through the door");
majorTom("floating in a most peculiar way");
Salin selepas log masuk
"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."
Salin selepas log masuk
repeat is a function that takes a function reference, and 2 numbers. The first number is how many times to call the function and the second represents the delay, in milliseconds, between each call. Here's the definition for repeat:

Salin selepas log masuk
Walau bagaimanapun, saya ingin membuat versi khas fungsi itu yang mengulangi 3 kali dengan kelewatan 2 saat antara setiap kali. Dengan fungsi ulangan saya, saya boleh melakukan ini:

function repeat(fn, times, delay) {
  return function() {
    if(times-- > 0) {
      fn.apply(null, arguments);
      var args = Array.prototype.slice.call(arguments);
      var self = arguments.callee;
      setTimeout(function(){self.apply(null,args)}, delay);
    }
  };
}
Salin selepas log masuk
Hasil memanggil fungsi SomethingWrong adalah kotak amaran yang diulang 3 kali dengan kelewatan 2 saat antara setiap amaran.

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

soalan yang sering ditanya mengenai argumen JavaScript

Apakah objek 'Argumen' dalam JavaScript? Ia mengandungi struktur seperti array dengan semua argumen yang diserahkan kepada fungsi. Objek ini berguna apabila fungsi perlu mengendalikan nombor argumen yang berubah -ubah. Adalah penting untuk diperhatikan bahawa objek 'argumen' bukanlah array sebenar, tetapi ia boleh ditukar kepada seseorang jika diperlukan. Walau bagaimanapun, anda boleh mengubahnya menjadi array menggunakan kaedah Array.From () atau pengendali penyebaran (...). Berikut adalah contoh:

fungsi converArgStoArray () { var argsArray = array.from (argumen); Fungsi anak panah. Fungsi anak panah tidak mempunyai objek 'argumen' mereka sendiri. Walau bagaimanapun, mereka boleh mengakses objek 'Argumen' dari fungsi induk yang tidak terdekat. Ia mengembalikan rentetan yang menunjukkan jenis operan yang tidak dielakkan. Sebagai contoh, 'Typeof 3' akan kembali 'nombor', dan 'Typeof "Hello' 'akan kembali' String '. Berikut adalah contoh:

checkArgStype () {

untuk (var i = 0; i console.log (typeof argumen [i]); merujuk kepada hujah pertama yang diserahkan kepada fungsi. Begitu juga, 'argumen [1]' merujuk kepada hujah kedua, dan sebagainya. Sekiranya tiada hujah yang diluluskan, 'Argumen [0]' akan 'tidak ditentukan'. Walau bagaimanapun, ia secara amnya tidak disyorkan kerana ia boleh membawa kepada kod yang mengelirukan dan keras. Dalam mod yang ketat, apa -apa percubaan untuk mengubahsuai objek 'Argumen' akan membuang kesilapan. Ia berguna apabila anda perlu melangkah ke atas hujah -hujah atau menentukan berapa banyak argumen yang diluluskan.

Bolehkah saya menggunakan objek 'Argumen' dengan parameter lalai dalam JavaScript?

Ya, tetapi dengan kaveat. Sekiranya fungsi dengan parameter lalai dipanggil dengan argumen yang lebih sedikit daripada terdapat parameter, objek 'argumen' hanya akan mengandungi argumen sebenar yang diluluskan, bukan nilai lalai. Harta ini ditutup dan tidak boleh digunakan dalam kod baru. Sebaliknya, anda boleh menggunakan ekspresi fungsi bernama atau fungsi anak panah.

Atas ialah kandungan terperinci Argumen: Keanehan JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan