__this__ - zmienna wskazującą wiązanie do obiektu, z którego funkcja była wywołana.
* funkcja strzałkowa nie posiada własnego `this`-a (odnosi się do obiektu globalnego, arrow functions are always anonymous),
* `this` funkcji ('zwykłej') w obiekcie referuje do zakresu, w którym została zadeklarowana.
* `this` funkcji w funkcji zwraca Window.
* `this` funkcji w funkcji w trybie strict zwraca undefined.
* `this` w funkcji będacej właściwością obiektu zwraca ten obiekt.
* `this` w instancji funkcji (`new`) zwraca referencję do tej funkcji.
```javascript
function a() {
console.log('a', this); // a, Window
function b() {
console.log('b', this); // b, Window
}
b();
}
var f = {
a: () => {
'use strict';
console.log('a', this); // Window
},
b: function() {
'use strict';
console.log('b', this); // {a: function, b: function, c: function, e: function}
},
c: {
d: function() {
console.log('d', this); // {d: function}
}
},
e: function() {
function g() {
console.log('g', this); // 'g', Window
}
function h() {
"use strict";
console.log('h', this); // 'h', undefined
}
const i = () => {
console.log('i', this); // {a: function, b: function, c: function, e: function}
}
g();
h();
i();
}
};
function baz() {
this.a = "Hi!";
console.log(this);
}
baz(); // Window
var a = new baz(); // {a: "Hi!"}
```
```javascript
var foo = "Global foo!";
var o = {
foo: "Object's foo!"
}
const arrow = param => {
return `${this.foo} ${param}`;
}
function a(param) {
return `${this.foo} ${param}`;
}
// Funkcja strzałkowa zawsze odnosi się do obiektu globalnego, nie można jej wskazać this-a.
arrow.call(o, 1); // Global foo! 1
// bind Zwraca nową funkcję z wywołanym apply.
var bindedA = a.bind(o);
// var bindedA = a.bind(o, 5);
console.log('Init: ', a(1)); // Global foo! 1
console.log('Call: ', a.call(o, 2)); // Object's foo! 2
console.log('Apply: ', a.apply(o, [3])); // Object's foo! 3
console.log('Binded: ', bindedA(4)); // Object's foo! 4
```