Kód uvnitř funkce
JavaScriptu se spustí, když jej „něco“ vyvolá.
Kód uvnitř funkce se nespustí, když je funkce definována.
Kód uvnitř funkce se spustí, když je funkce vyvolána.
Je běžné používat výraz „volání funkce“ namísto „vyvolat funkci“.
Běžné je také říkat „zavolat funkci“, „spustit funkci“, popř "vykonat funkci".
V tomto tutoriálu použijeme invoke, protože a Funkci JavaScript lze vyvolat bez volání.
function myFunction(a, b) {
return a * b;
}
myFunction(10, 2); //
Will return 20
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>The global function (myFunction) returns the product of the arguments (a ,b):</p>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
document.getElementById("demo").innerHTML = myFunction(10, 2);
</script>
</body>
</html>
Výše uvedená funkce nepatří žádnému objektu. Ale v JavaScriptu tam je vždy výchozí globální objekt.
V HTML je výchozím globálním objektem samotná stránka HTML, takže funkce výše „patří“ do HTML stránku.
V prohlížeči je objektem stránky okno prohlížeče. Funkce výše automaticky se stane funkcí okna.
Toto je běžný způsob vyvolání funkce JavaScriptu, ale není to příliš dobrý postup.
Globální proměnné, metody nebo funkce mohou snadno vytvářet konflikty názvů a chyby v globálním objektu.
myFunction() a window.myFunction() je stejná funkce:
function myFunction(a, b) {
return a * b;
}
window.myFunction(10, 2); // Will also return 20
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>Global functions automatically become window methods. Invoking myFunction() is the same as invoking window.myFunction().</p>
<p id="demo"></p>
<script>
function myFunction(a, b) {
return a * b;
}
document.getElementById("demo").innerHTML = window.myFunction(10, 2);
</script>
</body>
</html>
V JavaScriptu odkazuje klíčové slovo toto
na objekt.
Který objekt závisí na tom, jak je tento
vyvolán (použit nebo zavolán).
Klíčové slovo toto
odkazuje na různé objekty v závislosti na tom, jak se používá:
V objektové metodě toto
odkazuje na objekt.
Samotné toto
odkazuje na globální objekt.
Ve funkci toto
odkazuje na globální objekt.
Ve funkci je v přísném režimu toto
nedefinováno
.
V události toto
odkazuje na prvek, který přijal událost.
Metody jako call()
, apply()
a bind()
může odkazovat toto
na jakýkoli objekt.
toto
není proměnná. Je to klíčové slovo. Hodnotu toto
nelze změnit.
Výukový tento JavaScript
Když je funkce volána bez objektu vlastníka, hodnota toto
se stane globálním objektem.
Ve webovém prohlížeči je globálním objektem okno prohlížeče.
Tento příklad vrátí objekt okna jako hodnotu toto
:
let x = myFunction();
// x will be the window object
function myFunction() {
return this;
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>In HTML the value of <b>this</b>, in a global function, is the window object.</p>
<p id="demo"></p>
<script>
let x = myFunction();
function myFunction() {
return this;
}
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
Vyvolání funkce jako globální funkce způsobí, že hodnota this bude globálním objektem.
Použití objektu okna jako proměnné může snadno spadnout váš program.
V JavaScriptu můžete definovat funkce jako objektové metody.
Následující příklad vytvoří objekt (myObject) se dvěma vlastnosti (jméno a příjmení) a a metoda (fullName):
const myObject = {
firstName:"John",
lastName: "Doe",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
myObject.fullName(); // Will return "John Doe"
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>myObject.fullName() will return John Doe:</p>
<p id="demo"></p>
<script>
const myObject = {
firstName:"John",
lastName: "Doe",
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
document.getElementById("demo").innerHTML = myObject.fullName();
</script>
</body>
</html>
Metoda fullName je funkce. Funkce patří do objekt. myObject je vlastníkem funkce.
Věc zvaná toto
je objekt, který „vlastní“ kód JavaScript. V tomto případě hodnota toto
je můjObjekt.
Otestujte to! Změňte metodu fullName tak, aby vracela hodnotu toto
:
const myObject = {
firstName:"John",
lastName: "Doe",
fullName: function () {
return this;
}
}
// This will return [object Object] (the owner object)
myObject.fullName();
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>The value of <b>this</b>, in an object method, is the owner object.</p>
<p id="demo"></p>
<script>
const myObject = {
firstName:"John",
lastName: "Doe",
fullName: function() {
return this;
}
}
document.getElementById("demo").innerHTML = myObject.fullName();
</script>
</body>
</html>
Vyvolání funkce jako objektové metody způsobí hodnotu toto
být objektem samotným.
Pokud vyvolání funkce předchází klíčové slovo new
, je to vyvolání konstruktoru.
Vypadá to, že vytvoříte novou funkci, ale protože funkce JavaScriptu jsou objekty ve skutečnosti vytvoříte nový objekt:
// This is a function constructor:
function myFunction(arg1, arg2) {
this.firstName = arg1;
this.lastName = arg2;
}
// This creates a new object
const myObj = new myFunction("John", "Doe");
// This will return "John"
myObj.firstName;
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>In this example, myFunction is a function constructor:</p>
<p id="demo"></p>
<script>
function myFunction(arg1, arg2) {
this.firstName = arg1;
this.lastName = arg2;
}
const myObj = new myFunction("John","Doe")
document.getElementById("demo").innerHTML = myObj.firstName;
</script>
</body>
</html>
Vyvolání konstruktoru vytvoří nový objekt. Nový objekt zdědí vlastnosti a metody od jeho konstruktoru.
Klíčové slovo toto
v konstruktoru nemá hodnotu.
Hodnota toto
bude nový objekt vytvořený při vyvolání funkce.