Dalam JavaScript, fungsi disebut Objek Fungsi karena merupakan objek. Sama seperti objek, fungsi memiliki properti dan metode, mereka dapat disimpan dalam variabel atau larik, dan diteruskan sebagai argumen ke fungsi lain. Show Fungsi adalah Objek Kelas SatuSeperti disebutkan, fungsi adalah objek. Anda dapat bekerja dengan fungsi seolah-olah itu adalah objek. Misalnya, Anda dapat menetapkan fungsi ke variabel, ke elemen array, dan ke objek lain. Mereka juga dapat diedarkan sebagai argumen ke fungsi lain atau dikembalikan dari fungsi tersebut. Satu-satunya perbedaan dengan objek adalah bahwa fungsi dapat dipanggil Mari kita jalankan tes kecil dan konfirmasikan bahwa suatu fungsi memang merupakan instance objek function message() { console.log("Greetings Linda!"); } console.log(typeof message); // => function console.log(message instanceof Object); // => true _LariKita melihat bahwa suatu fungsi memang merupakan objek. Fungsi JavaScript adalah jenis objek khusus, yang disebut objek fungsi. Objek fungsi menyertakan string yang menyimpan kode aktual -- badan fungsi -- dari fungsi tersebut. Kode ini secara harfiah hanyalah sebuah string. Meskipun tidak disarankan, Anda dapat membuat objek fungsi baru dengan meneruskan string kode ke konstruktor Fungsi bawaan, seperti itu var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398.. JalankanAnda juga dapat membuat fungsi baru dengan fungsi konstruktor khusus (ingat bahwa menurut konvensi, fungsi konstruktor selalu dimulai dengan huruf besar). Pada kode di bawah ini kita memiliki fungsi konstruktor _8 yang digunakan untuk membuat instance buku. Dalam fungsi konstruktor, kami menugaskan objek fungsi ke properti 9function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_ LariKonstruktor _8 menerima argumen yang diberikan ke properti bernama function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King1. Setelah objek dibuat, Anda dapat menetapkan nilai properti dan memanggil metode seperti objek lainnya Objek fungsi juga dapat dibuat sebagai bagian dari literal objek. Di bawah ini kita membuat objek bernama function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_2 dengan properti bernama function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 yang merupakan fungsi objek var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function JalankanSelanjutnya, mari kita lihat contoh di mana objek fungsi diedarkan seperti objek biasa. Fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 mengambil fungsi sebagai argumennya. Fungsi baru dikembalikan dari panggilan function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_4 yang memanggil fungsi yang diteruskan dan mengembalikan negasi logis dari nilai pengembaliannya Mengikuti deklarasi fungsi, kami meneruskan fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King6 bawaan ke function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 dan menetapkan fungsi yang dikembalikan ke variabel function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King8. Variabel function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_8 adalah objek fungsi yang dapat diteruskan seperti objek apa pun. Untuk menjalankan fungsi, Anda memanggilnya dengan parameter berbeda function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false JalankanBerikut adalah contoh lain menggunakan fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_4 yang sama. Kami menambahkan fungsi khusus untuk menguji apakah suatu bilangan prima atau bukan (bilangan bukan prima disebut komposit). Fungsi ini diteruskan ke fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King_4 sebagai argumen _0 1LariCatatan. metode 2 bawaan menguji apakah semua elemen dalam larik lulus uji yang diterapkan oleh fungsi yang diteruskan sebagai argumen; Fungsi Disalin oleh ReferensiSaat Anda menetapkan objek fungsi ke variabel lain, JavaScript tidak membuat salinan baru dari fungsi tersebut. Sebaliknya itu membuat referensi variabel baru objek fungsi yang sama seperti aslinya. Hanya saja dua variabel yang memiliki nama berbeda mengakses objek fungsi dasar yang sama _2 _3LariContoh ini menunjukkan bahwa jika kita menambahkan properti ke objek fungsi, maka kedua variabel, 4 dan 5, akan diubah karena mereferensikan objek fungsi yang sama. Ini menegaskan bahwa objek fungsi memang disalin dengan referensiKami baru mengetahui bahwa objek fungsi disalin dengan referensi. Namun, saat memodifikasi badan fungsi yang sebenarnya, hal-hal sedikit berbeda karena ini akan menyebabkan objek fungsi baru dibuat. Pada contoh berikutnya badan fungsi _4 diubah dan JavaScript akan membuat objek fungsi baru _4 5LariMenetapkan badan fungsi baru ke 4 akan membuat objek fungsi baru. Perhatikan bahwa variabel _5 masih mereferensikan objek fungsi lamaMelewati fungsi sebagai CallbackSama seperti objek biasa, Anda dapat meneruskan objek fungsi ke fungsi lain (sebenarnya Anda sudah melihat ini beraksi dengan contoh fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4) Dalam contoh berikutnya, dua fungsi berbeda, var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function0 dan var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function1, diteruskan sebagai parameter ke fungsi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function2. Tentu saja, hanya referensi ke fungsi yang diteruskan. Fungsi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function0 dan var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function1 disebut callback atau lebih tepatnya fungsi callback. Fungsi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function_2 akan memanggilnya kembali (mis. e. memanggilnya) dengan dua nilai argumen yang disediakan _6 _7LariFungsi panggilan balik memainkan peran penting dalam banyak kerangka kerja, termasuk JQuery. Pertimbangkan kode di bawah ini. Pesan var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function_6 dijalankan dengan baik sebelum animasi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function7 selesai, yang mungkin bukan yang Anda inginkan 8Jalankan ResetHal ini dapat diatasi dengan meneruskan fungsi panggilan balik yang hanya akan dijalankan saat animasi selesai _9Jalankan ResetJadi, alih-alih menunggu fungsi selesai, Anda dapat menggunakan callback untuk menjalankannya secara asinkron. Ini bermanfaat untuk tugas yang membutuhkan waktu untuk diselesaikan, seperti animasi sembunyikan di atas. Contoh lainnya adalah saat menjalankan operasi AJAX dan Anda tidak ingin pengguna menunggu panggilan kembali. Ini memungkinkan browser untuk terus merespons permintaan pengguna sambil menunggu fungsi callback dipanggil Pemrograman asinkron adalah keterampilan penting yang harus dimiliki saat bekerja dengan JavaScript. Untuk mempelajari lebih lanjut tentang callback dan loop peristiwa penting, kami sarankan Anda memeriksa JS Dofactory kami yang unik di mana kami menjelajahi ini dan topik lainnya dengan lebih detail. Klik di sini untuk detail lebih lanjut Dalam situasi di mana suatu fungsi dipanggil berulang kali dengan sebagian besar argumen yang sama, Anda mungkin memiliki kandidat untuk kari. Untuk mencari fungsi pada dasarnya adalah menyimpan dan menggunakan kembali nilai argumen Fungsi kari menggunakan penutupan untuk meng-cache status argumen berulang sehingga Anda tidak perlu meneruskannya setiap saat. Fungsi baru kemudian menggunakannya untuk mempopulasikan seluruh daftar argumen yang diperlukan oleh fungsi aslinya Input untuk proses currying adalah fungsi yang menerima dua atau lebih argumen. Itu kemudian mengubah fungsi untuk menghasilkan fungsi baru yang menawarkan fungsionalitas serupa tetapi dengan argumen parsial (lebih sedikit dari yang asli). Itu mengikat sisa argumen ke nilai tetap Mari kita lihat sebuah contoh. Fungsi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function_8 menerima dua argumen untuk nama depan dan nama belakang. var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function9 dan 0. Itu menggabungkan mereka untuk menghasilkan nama orang tersebutvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..0 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..1Lari Selanjutnya, kami membuat versi kari dari fungsi yang sama. Jika kita memberikan dua argumen, maka akan dieksekusi secara normal, seperti contoh di atas. Namun, jika kita hanya meneruskan argumen var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function_9, maka fungsi lain dikembalikan dengan penutupannya yang menyimpan nilai var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function9. Fungsi yang dikembalikan menerima sebagian daftar argumen, dalam contoh kita, hanya satu argumen yaitu 0 karena sudah mengetahui nilai var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function9. Sekali lagi, ia melakukan pekerjaan yang sama seperti var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function_8, tetapi nilai var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function9 diingat dalam penutupan terkait dengan fungsi pembantu anonim yang dikembalikan var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..2 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..3Lari Dalam JavaScript, suatu fungsi membutuhkan fungsi pembantu untuk mencapai kari. Fungsi pembantu ini biasa disebut dengan fungsi kari Ada implementasi generik dari currying yang dapat diterapkan ke fungsi apa pun dan kode di bawah ini menunjukkannya. Itu menciptakan penutupan yang menyimpan fungsi asli dan argumen untuk kari. Kemudian, saat dipanggil lagi, ia menggabungkan argumen yang masuk dengan array argumen sebelumnya dan menjalankan fungsi aslinya. Satu larik menyimpan argumen yang diteruskan ke pemanggilan saat ini dan larik lainnya menyimpan argumen yang diteruskan ke fungsi curry. Array gabungan kemudian diteruskan ke fungsi aslinya var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398.._4 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..5Lari Semua fungsi JavaScript memiliki metode yang disebut _7 yang mengikat objek dan mengembalikan fungsi baru. Argumen pertama untuk mengikat menetapkan 8 konteks fungsivar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..6 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..7Lari Memanggil 9 memanggil fungsi asli function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 sebagai metode function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false1, seperti function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false2. Argumen yang Anda teruskan ke function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false_3 diteruskan sebagai argumen function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false4 ke fungsi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 Selain mengikat fungsi ke objek, EcmaScript 5 mendukung metode 7 yang membawa kari asli ke JavaScript. Anda tidak perlu lagi menggunakan fungsi pembantu kari. Jumlah arbitrer argumen yang Anda teruskan ke 7 juga terikatvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398.._8 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..9Lari Ini menciptakan fungsi baru yang disebut ________20______8. Nilai _8 terikat ke null, i. e. objek global, dan _0 dan 1 argumen terikat masing-masing ke 1 dan 2. Memanggil function negate(f) { return function (i) { return !f(i); }; } var isNumber = negate(isNaN); // function object console.log(isNumber(5)); // => true console.log(isNumber(NaN)); // => false console.log(isNumber("A")); // => false8 dengan nilai argumen 3 mengikat nilai ini ke 0 dan kemudian menjalankan fungsi var circle = { radius: 10, area: function () { return Math.PI * this.radius * this.radius; } }; console.log(circle.area()); // => 314.15.. console.log(typeof circle.area); // => function0 tanpa perlu menulis fungsi kari Selanjutnya, mari kita lihat aplikasi praktis dari kari dalam bidang konversi satuan 0 1JalankanFungsi _5 melakukan perhitungan konversi satuan yang sebenarnya. Lihatlah _7 dan, sekali lagi, argumen nol mengacu pada objek global yang akan digunakan sebagai 8. Tiga argumen berikutnya masing-masing terikat pada _8, 9, dan 00. Pengikatan ini disimpan dan dipelihara dalam penutupan yang terkait dengan objek fungsi 01 dan 02. Dalam dua baris terakhir kita memanggil setiap fungsi dengan nilai yang kemudian terikat ke variabel 03 dan fungsi 5 asli disebut mengembalikan hasil yang diinginkanMisalkan Anda sedang membuat game balap mobil dalam JavaScript dan Anda perlu melacak jumlah objek mobil yang telah dibuat instance-nya. Di Java, Anda akan menggunakan kata kunci statis untuk ini, tetapi JavaScript tidak menawarkan fungsionalitas seperti itu di luar kotak Tentu saja, Anda cukup menyimpan data ini dalam variabel global tetapi ini akan menambah variabel yang tidak diperlukan ke namespace global. Solusi yang lebih baik adalah menyimpan informasi ini di properti objek fungsi. Mari kita panggil fungsi _05 dan gunakan untuk mengingat nilai selanjutnya yang akan dikembalikan. Maka fungsi akan dapat mengembalikan nilai yang berbeda setiap kali dipanggil 2 3LariDalam pemrograman fungsional, menyimpan hasil pemanggilan fungsi disebut sebagai memoisasi. Mari jelajahi ini dengan sedikit lebih detail Memoisasi adalah teknik pengoptimalan yang digunakan untuk meningkatkan kinerja suatu fungsi dengan menyimpan nilai pengembaliannya sehingga fungsi tersebut tidak perlu mengulang perhitungan yang berpotensi berat saat dipanggil lagi Tidak semua fungsi dapat di-memo; . Fungsi transparan referensial adalah fungsi yang selalu menghasilkan output yang sama pada input yang diberikan. Misalnya, jika Anda memanggil fungsi dengan nilai x yang diteruskan ke fungsi tersebut, fungsi tersebut akan melakukan perhitungan pada x dan selalu mengembalikan nilai y terkait yang sama Contoh bagus di mana memoisasi dapat bermanfaat adalah animasi Kanvas HTML5 dan perhitungan matematis rekursif, seperti perhitungan faktorial, menghasilkan urutan Fibonacci, dan perkalian rantai matriks Mari kita lihat bagaimana memoisasi dapat digunakan untuk meningkatkan penghitungan angka Fibonacci. Pendekatan rekursif untuk menghasilkan angka-angka ini tidak berskala dengan baik. Pada contoh di bawah ini, fungsi _06 dipanggil secara rekursif sebanyak 177 kali untuk menghasilkan jumlah dari 10 angka Fibonacci pertama _4 5LariProgram melakukan banyak pekerjaan ekstra dengan tidak melacak nilai yang dihitung sebelumnya. Di sinilah memoisasi masuk. Pertama, nyatakan larik cache tempat Anda dapat menyimpan nilai fungsi yang sudah dihitung yang dikembalikan dalam panggilan sebelumnya. Kemudian, alih-alih memanggil fungsi, kembalikan nilai ini dalam panggilan berikutnya ke fungsi tersebut, seperti itu 6 7LariUntuk menghasilkan 10 angka Fibonacci pertama, fungsi ini dijalankan secara rekursif sebanyak 20 kali saja. Peningkatan yang signifikan Bisakah saya menambahkan properti ke fungsi di JavaScript?@alessioalex - Anda pasti dapat menambahkan properti langsung ke fungsi . Ini tidak selalu merupakan cara yang paling tepat untuk dilakukan, tetapi ini (sengaja) menjadi bagian dari bahasa dan berfungsi dengan baik. (Ini memiliki tujuan berbeda untuk menambahkan properti ke prototipe. )
Bagaimana cara menambahkan properti ke objek JavaScript dalam suatu fungsi?Beberapa cara untuk menambahkan properti ke objek JavaScript termasuk. menggunakan notasi titik, menggunakan notasi braket [ ], menggunakan metode defineProperty(), menggunakan operator spread, dan menggunakan Object. metode penetapan() .
Bagaimana cara menambahkan elemen ke objek dalam JavaScript?Menggunakan tanda kurung siku [] . Dalam JavaScript, kita dapat menggunakan tanda kurung [] untuk menambahkan elemen ke objek. |