Расширение класса(просто пример)
Здравствуйте, подскажите какую роль в выражении определения функции в этом коде играет параметр "context", почему в цикле не указать инструкцию
f.call(this, i)и опустить объявление "context". Спасибо.
Number.prototype.times = function(f, context) {
var n = Number(this);
for(var i = 0; i < n; i++) f.call(context, i);
};
var n = 3;
n.times(function(n) { console.log(n + " привет");
});
|
uanr81, это чтобы свой контекст для "f" можно было указывать.
var obj = {foo: 'bar'};
123..times(function() {
alert(this.foo);
}, obj);
Логичнее наверное написать так: f.call(context || this, i); Т.е., если мы не передаём свой контекст, то будет использоваться this. |
Получается call вызывается в контексте выражения присваиваемому параметру "context". Честно говоря туман не сильно рассеялся, разве не можно так
Number.prototype.times = function(f) {
var n = Number(this);
for(var i = 0; i < n; i++) f.call(null, i);
};
var n = 3;
n.times(function() {
alert(obj.foo);
});
var obj = {foo: 'bar'};
опять же без ентого параметра "context". Можно ещё пример, может дойдёт. Спасибо |
Да там у тебя просто мусор. Можно вот так.
Number.prototype.times = function(f) {
for(var i = 0; i < this; i++) f.call(this, i);
};
3..times(function(n) {
console.log(n + " привет");
});
|
Цитата:
Number.prototype.times = function(f) {
for(var i = 0; i < this; i++) f.call(this, i);
};
3..times.call(5, function(n) {
console.log(n + " привет");
});
это просто тупой код. |
sedquest, бред пишешь.
|
uanr81, всё дело в удобстве. Предположим, что у нас одна и та же функция используется в разных times, для каждой нужен разный контекст:
var a = {foo: 'bar'};
var b = {bar: 'foo'};
function callback() {
console.log(this);
};
123..times(callback, a);
456..times(callback, b);
А если нам родительский контекст нужно передать?
function a() {
console.log(this); //hi
123..times(function() {
console.log(this); //тут уже другой контекст
});
};
a.call('hi');
function a() {
console.log(this); //hi
123..times(function() {
console.log(this); //hi
}, this);
};
a.call('hi');
|
Хотя наверное если obj ,будет не свойством глобального объекта, мой код не сработает.
|
Цитата:
Спасибо. |
Ruslan_xDD вы просто красавец, уловили суть вопроса и объяснили доходчиво. Спасибо громадное, а то встретится не понятное при изучении и сколько дальше не вникай всё на месте:victory: :victory: :victory:
|
| Часовой пояс GMT +3, время: 01:10. |