Funktsionaalavaldiste nüansid JavaScriptis

Nimetust Function Expression ei ole antud niisama. See tõesti tähendab seda - et sellised funktsioonid on osa mingist avaldisest.

Näiteks võime liita mingi stringi ja nimetuta funktsiooni:

javascriptlet str = 'str' + function() {return 3;};
console.log(str); // väljastab 'strfunction() {return 3;}'

Miks me näeme sellist kummalist tulemust, mitte arvu 3? Sellepärast, et teine liidetav - see pole funktsiooni töö tulemus, vaid selle lähtekood (me ju ei kutsunud seda funktsiooni välja, vaid lihtsalt kirjutasime seda).

See tähendab, et nimetus funktsionaalavaldis tähistab seda, et selline funktsioon osaleb mingis avaldises.

Muutujale omistamine on samuti avaldis:

javascriptlet func = function() {
  console.log('!');
};

Samuti võib näiteks edastada funktsiooni parameetrina console.log-ile ja see väljastab selle lähtekoodi konsooli - see loetakse samuti avaldiseks:

javascriptconsole.log(function() {return 3;});

Miks see on oluline: sest Function Declaration ja Function Expression erinevus ei seisne üldse selles, et esimene funktsioon luuakse nimega, aga teine algselt nime ei oma. See pole nii.

Näide. Siin on meil funktsioon ilma nimeta, kuid sellega ei osaleta üheski avaldises (see tähendab, et sellega ei tehta mingit tegevust, lihtsamalt öeldes):

javascript/*
  See funktsioon on Function Declaration,
  kuid süntaksiveaga:
*/
function() {
  console.log('!');
}

Selline kood annab üldse vea! Miks: kuna funktsioon ei osale üheski avaldises, siis brauser peab seda Function Declaration-iks, kuid ei leia selle nime ja annab vea.

Et viga kaoks, tuleb muuta funktsioon mingi avaldise osaks. Näiteks kirjutame selle ette tehte +:

javascript+function() { // selline kood on korrektne
  console.log('!');
};

Kuidas see töötab: tehe + ise ei tee midagi, see on sama, kui kirjutada arvu 3 asemel arv +3 - lubatud, kuid midagi ei muuda.

Kuid funktsiooni puhul - muudab. Nüüd on meie funktsioon juba mitte lihtsalt kirjutatud, vaid osaleb avaldises. Seetõttu ei teki viga. Funktsiooni täitmistulemust ka ei teki, sest me lihtsalt kirjutasime selle, kuid ei kutsunud välja.

+ asemel võib kirjutada mis tahes. Näiteks:

javascript-function() { // selline kood on korrektne
  console.log('!');
};

!function() { // selline kood on korrektne
  console.log('!');
};

Samuti võib võtta meie funktsiooni ümarsulgudesse, sel juhul muutub see samuti funktsionaalavaldiseks:

javascript(function() { // selline kood on korrektne
  console.log('!');
});
Задание 1

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascriptfunction func() {
  console.log('!');
}
Задание 2

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascriptlet func = function() {
  console.log('!');
}
Задание 3

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascript+function() {
  console.log('!');
}
Задание 4

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascript!function func() {
  console.log('!');
}
Задание 5

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascript-function func() {
  console.log('!');
}
Задание 6

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascript1 + function func() {
  console.log('!');
}
Задание 7

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascript(function func() {
  console.log('!');
})
Задание 8

Määrake, kas esitatud funktsioon on Function Declaration või Function Expression:

javascriptconsole.log(
  function() {
    console.log('!');
  }
);