Proč jeden pult práci a druhý ne? (Uzávěry?)

hlasů
0

Mám dvě otázky týkající se tohoto protipříklad.

  1. Proč ne addVersionOne práci? Proč se vrací skutečný kód namísto čísla?
  2. Jak se addVersionTwo funguje? Není counterse vrátí na 0pokaždé, když je tato funkce spustit?

const addVersionOne = function() {
  let counter = 0;
  return function() {
    counter += 1;
    return counter;
  }
}

var addVersionTwo = (function () {
  let counter = 0;
  return function() {
    counter += 1; 
    return counter;
  }
})();

function writeVersionOne(){
  document.getElementById(addVersionOne).innerHTML = addVersionOne();
}

function writeVersionTwo(){
  document.getElementById(addVersionTwo).innerHTML = addVersionTwo();
}
<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8 />
  <meta http-equiv=X-UA-Compatible content=IE=edge>
  <title>Page Title</title>
  <meta name=viewport content=width=device-width, initial-scale=1>
  <button type=button onclick=writeVersionOne()>addVersionOne</button>
  <button type=button onclick=writeVersionTwo()>addVersionTwo</button>
  <p id=addVersionOne>0</p>
  <p id=addVersionTwo>0</p>
  <script src=main.js></script>
</head>
<body>
  
</body>
</html>

Položena 27/11/2018 v 17:48
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Po spuštění toto:

addVersionOne()

Jaký je výsledek? No, uvidíme, co tato funkce vrací:

//...
return function() {
    counter += 1;
    return counter;
}

Vrátí funkce. Tato funkce je nikdy provedeny, je to právě vrátil. Tato funkce sama o sobě je nastaven jako innerHTMLpro vaši cílovou prvek.

Ale to, co dělá tento výnos ?:

addVersionTwo()

Všimněte si, jak se vaše druhá verze zábaly vše v závorkách a potom přidá další sadu závorky vyvolat vrácenou funkci. Takže zatímco proměnná addVersionOneje funkce, která vrací funkce, proměnná addVersionTwoje, že funkce vrací. A to vrací hodnotu:

//...
return counter;

Není counter je obnovit zpět na 0 pokaždé, když je tato funkce spustit?

Která „funkce“ máte na mysli? Máte několik. Tato funkce je proveden jednou , když se stránka načte:

function () {
    let counter = 0;
    return function() {
        counter += 1; 
        return counter;
    }
}

To pak se vrátí funkci, která je uložen v addVersionTwoproměnné. Že funkce je:

function() {
    counter += 1; 
    return counter;
}

A ne, že funkce nebude obnovena counter, aby 0pokaždé, když je spuštěn.

Odpovězeno 27/11/2018 v 17:57
zdroj uživatelem

hlasů
0

Vzhledem k tomu, návratová hodnota funkce addVersionOne je funkce, a to je zřejmé. Ale addVersionTwo funkce je ve skutečnosti výsledkem volání funkce, která vrací funkci. Takže addVersionTwo je ve skutečnosti nižší než funkce:

return function() {
    counter += 1; 
    return counter;
}

můžete definovat funkci addVersionTwo takto:

var counter = 0;

var addVersionTwo = function() {
    counter += 1; 
    return counter;
};
Odpovězeno 27/11/2018 v 17:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more