Ujanja wa Misemo ya Kifunction katika JavaScript
Jina Function Expression halikopewa bure. Kwa kweli linamaanisha hilo - kwamba kazi kama hizi ni sehemu ya usemi fulani.
Kwa mfano, tunaweza kuongeza mfumo wa mistari fulani na kazi isiyo na jina:
let str = 'str' + function() {return 3;};
console.log(str); // itatoa 'strfunction() {return 3;}'
Kwa nini tunaona matokeo hayo ya kushangaza,
na si nambari 3? Kwa sababu neno la pili
- hii si matokeo ya kazi, lakini yake ya awali
kanuni (tunafanya kazi hii haikutajwa, tu
iliandikwa).
Yaani jina kielelezo cha kazi inamaanisha kwamba kazi kama hiyo inachukua ushiriki katika usemi fulani.
Kugawia kwa kutofautisha pia ni usemi:
let func = function() {
console.log('!');
};
Pia inawezekana, kwa mfano, kupitisha kazi
kama kigezo katika console.log na itatoa
kanuni zake za asili kwenye konsoli - hii pia itakuwa
inachukuliwa kuwa usemi:
console.log(function() {return 3;});
Kwa nini hii ni muhimu: kwa sababu tofauti ya Function Declaration na Function Expression kabisa si kwamba kazi ya kwanza imeundwa na jina, na ya pili hapo mwanzo hana jina. Hii si kweli.
Mfano. Hapa kazi yetu haina jina, lakini wakati huo huo hushiriki katika usemi wowote (yaani hakuna vitendo vyake vyovyote, kusema kwa urahisi):
/*
Kazi hii itakuwa Function Declaration,
lakini na makosa ya ki-sintaksia:
*/
function() {
console.log('!');
}
Nambari kama hiyo itatoa hitilafu kabisa! Kwa nini: hivyo kama kazi haishiriki katika usemi wowote, basi kivinjari kinaihesabu kama Function Declaration, lakini haipati jina lake na inatoa hitilafu.
Ili hitilafu iondoke, unahitaji kulazimisha kazi
kuwa sehemu ya usemi fulani. Kwa mfano,
tuandike operesheni mbele yake +:
+function() { // msimbo kama huu ni sahihi
console.log('!');
};
Hii inafanyaje kazi: operesheni yenyewe +
haitendi chochote, hii ni sawa na kuandika
badala ya nambari 3 nambari +3 - inakubalika,
lakini hakuna kinachobadilika.
Lakini kwa upande wa kazi - inabadilika. Sasa yetu kazi tayari sio tu imeandikwa, bali inashiriki katika usemi. Kwa hivyo hitilafu haitakuwa tena. Matokeo ya utekelezaji wa kazi pia hayatakuwa, maana tumeiandika tu, lakini hatukuita.
Badala ya + inaweza kuandikwa chochote.
Kwa mfano:
-function() { // msimbo kama huu ni sahihi
console.log('!');
};
!function() { // msimbo kama huu ni sahihi
console.log('!');
};
Pia inawezekana kuchukua kazi yetu kwenye mabano ya mviringo, katika kesi hii pia itakuwa kielelezo cha kazi:
(function() { // msimbo kama huu ni sahihi
console.log('!');
});
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
function func() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
let func = function() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
+function() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
!function func() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
-function func() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
1 + function func() {
console.log('!');
}
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
(function func() {
console.log('!');
})
Amua ikiwa kazi iliyowakilishwa ni Function Declaration au Function Expression:
console.log(
function() {
console.log('!');
}
);