Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Расширение класса(просто пример) (https://javascript.ru/forum/misc/60168-rasshirenie-klassa-prosto-primer.html)

uanr81 14.12.2015 23:11

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

ruslan_mart 14.12.2015 23:21

uanr81, это чтобы свой контекст для "f" можно было указывать.

var obj = {foo: 'bar'};

123..times(function() {
   alert(this.foo);
}, obj);


Логичнее наверное написать так:

f.call(context || this, i);


Т.е., если мы не передаём свой контекст, то будет использоваться this.

uanr81 15.12.2015 00:08

Получается 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". Можно ещё пример, может дойдёт. Спасибо

sedquest 15.12.2015 00:21

Да там у тебя просто мусор. Можно вот так.
Number.prototype.times = function(f) {
for(var i = 0; i < this; i++) f.call(this, i);
};

 3..times(function(n) { 
   console.log(n + " привет");
});

sedquest 15.12.2015 00:26

Цитата:

Сообщение от Ruslan_xDD
это чтобы свой контекст для "f" можно было указывать.

Чтобы контекст явно указывать его и так можно передать
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 + " привет");
});

это просто тупой код.

ruslan_mart 15.12.2015 00:35

sedquest, бред пишешь.

ruslan_mart 15.12.2015 00:46

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');

uanr81 15.12.2015 00:57

Хотя наверное если obj ,будет не свойством глобального объекта, мой код не сработает.

uanr81 15.12.2015 01:17

Цитата:

Сообщение от Ruslan_xDD (Сообщение 399966)
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');

А ещё вопрос, вы пишите 123..times() - здесь интерпретатор обвёртывает 123 в объект Number ? Почему не срабатывает 123.times()?
Спасибо.

uanr81 15.12.2015 01:53

Ruslan_xDD вы просто красавец, уловили суть вопроса и объяснили доходчиво. Спасибо громадное, а то встретится не понятное при изучении и сколько дальше не вникай всё на месте:victory: :victory: :victory:


Часовой пояс GMT +3, время: 05:48.