Zvednutí je výchozí chování JavaScriptu při přesouvání deklarací do horní.
V JavaScriptu lze proměnnou deklarovat poté, co byla použita.
Jinými slovy; proměnná může být použita předtím, než byla deklarována.
Příklad 1 dává stejný výsledek jako Příklad 2:
x = 5; // Assign 5 to x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x;
// Display x in the element
var x; // Declare x
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
x = 5; // Assign 5 to x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x; // Display x in the element
var x; // Declare x
</script>
</body>
</html>
var x; // Declare x
x = 5; // Assign 5 to x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x;
// Display x in the element
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x; // Declare x
x = 5; // Assign 5 to x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x; // Display x in the element
</script>
</body>
</html>
Abyste tomu porozuměli, musíte rozumět pojmu „zvedání“.
Zvednutí je výchozí chování JavaScriptu při přesouvání všech deklarací do na začátek aktuálního rozsahu (na začátek aktuálního skriptu nebo aktuální funkce).
Proměnné definované pomocí let
a const
jsou vytaženy nahoru bloku, ale není inicializován.<p>Význam: Blok kódu si je vědom proměnnou, ale nelze ji použít, dokud nebude deklarována. <p>Použití proměnné let
před jejím deklarováním povede k ReferenceError
.
Proměnná je od začátku v "časové mrtvé zóně". bloku, dokud není deklarováno:
carName = "Volvo";
let carName;
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Hoisting</h2>
<p>With <b>let</b>, you cannot use a variable before it is declared.</p>
<p id="demo"></p>
<script>
try {
carName = "Saab";
let carName = "Volvo";
}
catch(err) {
document.getElementById("demo").innerHTML = err;
}
</script>
</body>
</html>
Použití proměnné const
před jejím deklarováním je syntaktická chyba, takže kód se prostě nespustí.
Tento kód se nespustí.
carName = "Volvo";
const carName;
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Hoisting</h2>
<p>With <b>const</b>, you cannot use a variable before it is declared.</p>
<p>Try to remove the //.</p>
<p id="demo"></p>
<script>
carName = "Volvo";
//const carName;
document.getElementById("demo").innerHTML = carName;
</script>
</body>
</html>
Přečtěte si více o let a const v JS Let/Const.
JavaScript shromažďuje pouze deklarace, nikoli inicializace.
Příklad 1 neposkytne stejný výsledek jako Příklad 2:
var x = 5; // Initialize x
var y = 7; // Initialize y
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y; // Display x and y
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x = 5; // Initialize x
var y = 7; // Initialize y
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y; // Display x and y
</script>
</body>
</html>
var x = 5; // Initialize x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y; // Display x and y
var y = 7; // Initialize y
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x = 5; // Initialize x
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = "x is " + x + " and y is " + y; // Display x and y
var y = 7; // Initialize y
</script>
</body>
</html>
Dává smysl, že y není v posledním příkladu definováno?
Je tomu tak proto, že nahoru je vytažena pouze deklarace (var y), nikoli inicializace (=7).
Kvůli zvedání bylo y deklarováno před jeho použitím, ale protože inicializace nejsou zvednuty, hodnota y není definována.
Příklad 2 je stejný jako psaní:
var x = 5; // Initialize x
var y; // Declare y
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y; // Display x and y
y = 7; // Assign 7 to y
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x = 5; // Initialize x
var y; // Declare y
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y; // Display x and y
y = 7; // Assign 7 to y
</script>
</body>
</html>
Zvedání je (pro mnoho vývojářů) neznámé nebo přehlížené chování JavaScript.
Pokud vývojář nerozumí zvedání, programy mohou obsahovat chyby (chyby).<p> Abyste se vyhnuli chybám, vždy deklarujte všechny proměnné na začátku každý rozsah.<p> Protože takto JavaScript interpretuje kód, je to vždy dobré pravidlo.
JavaScript v přísném režimu neumožňuje použití proměnných, pokud jsou není deklarováno.
Prostudujte si „použít přísné“ v další kapitole.