Расширение класса(просто пример)
Здравствуйте, подскажите какую роль в выражении определения функции в этом коде играет параметр "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, время: 05:48. |