arrow va oddiy funksiya orasidagi farqlar
1. Sintaksis
Arrow funksiyalarda yozilishida strelka ishlatiladi: =>
const sayHello = (name) => {
return 'Hello ' + name
}Agar funksiya tanasi faqat bitta ifodadan tashkil topgan bo'lsa return kalit so'zini ishlatish shart emas
const sayHello = (name) => 'Hello ' + name
Agar argumentlar soni bir dona bo'lsa, qavslar ham shart bo'lmaydi
const sayHello = name => 'Hello ' + name
2. arguments o'zgaruvchisi
Funksiya noma'lum miqdordagi argumentlarni qabul qilganda biz maxsus argumentsdeb nomlangan o'zgaruvchidan foydalanishimiz mumkin
function logNumbers(num1, num2) {
console.log(arguments)
}
logNumbers(8, 24) // Bu o'zgaruvchi orqali masalan quyidagicha funksiya yozishimiz mumkin:
function sum() {
return Array.from(arguments).reduce((sum, item) => sum + item, 0);
}
sum(1, 2, 3, 4, 5) // natija: 15 qaytaradiLekin bu o'zgaruvchi arrow funksiyalarda mavjud emas. Agar arrow funksiya ichida argumentso'zgaruvchisini ishlatmoqchi bo'lsak JavaScript ReferenceError xatoligini qaytaradi.
const logNumbers = (num1, num2) => {
console.log(arguments)
}
logNumbers(8, 24) // Uncaught ReferenceError: arguments is not definedArrow funksiyalarda barcha argumentlarni olish uchun spread sintaksisidan foydalanishimiz mumkin
const sum = (...numbers) => {
return numbers.reduce((sum, item) => sum + item, 0);
}
sum(1, 2, 3, 4, 5);3. Bir xil nomdagi takrorlangan argumentlar
Odatiy funksiyalarni e'lon qilishda bir xil nomdagi bir nechta parametr beradigan bo'lsak, eng oxirgisini oladi:
function exampleFunction(a, b, a) {
console.log(a, b)
}
exampleFunction("first", "second", "third")Ko'rib turganingizdek, a parametrining qiymati sifatida 3-argumentda berilgan "third" matni chiqyapti.
Ammo qat'iy rejimda, ya'ni "use strict" ishlatganimizda syntax error xatoligi sodir bo'ladi
Arrow funksiyalarda esa "use strict"ishlatmasak ham syntax error xatoligi sodir bo'ladi.
const exampleFunction = (a, b, a) => {
console.log(a, b)
}
exampleFunction("first", "second", "third")4. Hoisting
JavaScript-da hoisting - bu o'zgaruvchilar va funksiyalarni kod bajarilishidan oldin, kompilyatsiya paytida o'zlarining qamrab oluvchi doirasi (scope) yuqorisiga ko'chirilishidir
Oddiy funksiyalar yuqoriga ko'tariladi. Ularni e'lon qilinishidan oldin ham ularga murojaat qilish va chaqirish mumkin.
regularFunction()
function regularFunction() {
console.log("This is a regular function.")
}Arrow funksiyalar esa yuqoriga ko'tarilmaydi. Ularga faqat e'lon qilingandan so'nggina murojaat qilishimiz mumkin:
arrowFunction()
const arrowFunction = () => {
console.log("This is an arrow function.")
}5. this binding
Oddiy funksiyalarning o'zlarining this konteksti mavjud. Va bu kontekst funksiyani qanday chaqirganingiz yoki bajarganingizga qarab dinamik ravishda aniqlanadi.
arrow funksiyalarining esathis konteksti yo'q. Buning o'rniga, ular o'zlari yaratilgan atrofdagi leksik kontekstdan this qiymatini oladi.
Oddiy funksiyalarda, oddiy funksiya chaqiruvi this qiymatini window obyektiga o'rnatadi (yoki agar siz "qat'iy rejim"dan foydalanayotgan bo'lsangiz, undefined ga o'rnatadi):
function myRegularFunction() {
console.log(this)
}
myRegularFunction()Arrow funksiyalarda esa, oddiy funksiya chaqiruvi this qiymatini qat'iy rejimdan foydalanayotganingiz yoki yo'qligingizdan qat'i nazar, atrofdagi kontekstga o'rnatadi. Quyidagi misolda, atrofdagi kontekst global window obyektidir.
const myArrowFunction = () => {
console.log(this);
};
myArrowFunction()Obyektning metodi sifatida chaqirilganda
Agar obyekt ichidagi oddiy funksiyani ishga tushirsak, this o'sha obyektga teng bo'ladi. Amma obyekt ichidagi funksiya arrow bo'lsa, this window global obyektiga teng bo'ladi.
const myObject = {
regularExample: function() {
console.log("REGULAR: ", this)
},
arrowExample: () => {
console.log("ARROW: ", this)
}
}
myObject.regularExample()
myObject.arrowExample()Konstruktor funksiya sifatida ishlatish
Odatiy funksiyalarda new kalit so'zi orqali yangi obyekt hosil qilishimiz mumkin. Bu holatda this yaratilayotgan yangi obyektga teng bo'ladi.
Arrow funksiyalar bilan esa new orqali yangi obyekt yarata olmaymiz, sababi arrow funksiyalarida this yaratilayotgan obyektga emas, funksiyani o'rab turgan kontekstga teng bo'ladi. Shu sababli arrow funksiyalarni konstuktor sifatida ishlata olmaymiz.
function RegularFuncBird(name, color) {
this.name = name
this.species = color
console.log(this)
}
const ArrowFuncBird = (name, color) => {
this.name = name
this.color = color
console.log(this)
}
new RegularFuncBird("Parrot", "blue")
new ArrowFuncBird("Parrot", "blue")Maqolani tayyorlashda ishlatilgan resurslar:
https://www.freecodecamp.org/news/regular-vs-arrow-functions-javascript/