суббота, 3 июня 2017 г.

Sorax. 18. this и непрямой вызов методов

/* var person = {
name: "John",
greet: function(){
return "Hi! My name is " + person.name;
}
};


console.log(person.greet()); // Hi! My name is John */

// Изменим person на this
/* var person = {
name: "John",
greet: function(){
return "Hi! My name is " + this.name;
}
};

console.log(person.greet()); // Hi! My name is John */

/* var greet = function() {
return "Hi! My name is " + this.name;
}

var person = {
name: "John",
greet: greet
};

var anotherPerson = {
name: "Bob",
greet: greet
};

console.log(person.greet()); // Hi! My name is John
console.log(anotherPerson.greet()); // Hi! My name is Bob */

/* var greet = function() {
return "Hi! My name is " + this;
}

var person = {
name: "John",
greet: greet
};

var anotherPerson = {
name: "Bob",
greet: greet
};

console.log(greet()); // Hi! My name is [object Window]
console.log(this); // Window */

/* var greet = function() {
return "Hi! My name is " + this.name;
}

var person = {
name: "John",
greet: greet
};

var anotherPerson = {
name: "Bob",
greet: greet
};

console.log(person.greet()); // Hi! My name is John
console.log(anotherPerson.greet.call(person)); // Hi! My name is John */

var greet = function(greeting) {
return greeting + "! My name is " + this.name;
}

var person = {
name: "John",
greet: greet
};

var anotherPerson = {
name: "Bob",
greet: greet
};

console.log(person.greet("Hi")); // Hi! My name is John
console.log(anotherPerson.greet.call(person, "Bonjour")); // Bonjour! My name is John

// В apply аргументы передаются массивом, а не через запятую
console.log(anotherPerson.greet.apply(person, ["Bonjour"])); // Bonjour! My name is John

// Метод bind не вызывает функцию, а связывает ее с каким-либо объектом.
// Чтобы когда мы ее вызвали ключевое слово this указывало на тот объект, с которым оно было связано.
// Метод bind не изменяет исходную функцию, а возвращает новую функцию.
var bound = greet.bind(anotherPerson);
console.log(bound("Hello there")); // Hello there! My name is Bob


call - вызов функции с подменой контекста - this внутри функции.
Пример:
function f(arg) {
alert(arg);
alert(this);
}

f('abc'); // abc, [object Window]

f.call('123', 'abc'); // abc, 123

apply - вызов функции с переменным количеством аргументов и с подменой контекста.
Пример:
function f() {
alert(this);
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}

f(1, 2, 3); // [object Window], 1, 2, 3

f.apply('abc', [1, 2, 3, 4]); // abc, 1, 2, 3, 4

bind - создаёт "обёртку" над функцией, которая подменяет контекст этой функции. Поведение похоже на call и apply, но, в отличие от них, bind не вызывает функцию, а лишь возвращает "обёртку", которую можно вызвать позже.
Пример:
function f() {
alert(this);
}

var wrapped = f.bind('abc');

f(); // [object Window]
wrapped(); // abc

Также bind умеет подменять не только контекст, но и аргументы функции, осуществляя каррирование:
function add(a, b) {
return a + b;
}

var addOne = add.bind(null, 1);

alert(add(1, 2)); // 3


alert(addOne(2)); // 3

Комментариев нет:

Отправить комментарий