/*
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
Комментариев нет:
Отправить комментарий