Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.12.2015, 23:11
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Расширение класса(просто пример)
Здравствуйте, подскажите какую роль в выражении определения функции в этом коде играет параметр "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 + " привет");
});
Ответить с цитированием
  #2 (permalink)  
Старый 14.12.2015, 23:21
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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

var obj = {foo: 'bar'};

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


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

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


Т.е., если мы не передаём свой контекст, то будет использоваться this.
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2015, 00:08
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

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

Последний раз редактировалось uanr81, 15.12.2015 в 00:26.
Ответить с цитированием
  #4 (permalink)  
Старый 15.12.2015, 00:21
Новичок на форуме
Посмотреть профиль Найти все сообщения от sedquest
 
Регистрация: 15.12.2015
Сообщений: 2

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

 3..times(function(n) { 
   console.log(n + " привет");
});
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2015, 00:26
Новичок на форуме
Посмотреть профиль Найти все сообщения от sedquest
 
Регистрация: 15.12.2015
Сообщений: 2

Сообщение от 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 + " привет");
});

это просто тупой код.
Ответить с цитированием
  #6 (permalink)  
Старый 15.12.2015, 00:35
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

sedquest, бред пишешь.
Ответить с цитированием
  #7 (permalink)  
Старый 15.12.2015, 00:46
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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');
Ответить с цитированием
  #8 (permalink)  
Старый 15.12.2015, 00:57
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Хотя наверное если obj ,будет не свойством глобального объекта, мой код не сработает.
Ответить с цитированием
  #9 (permalink)  
Старый 15.12.2015, 01:17
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Сообщение от Ruslan_xDD Посмотреть сообщение
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()?
Спасибо.
Ответить с цитированием
  #10 (permalink)  
Старый 15.12.2015, 01:53
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите написать простое расширение к гугл хрому OSKOKOS Javascript под браузер 4 13.11.2014 18:32
Узнать расширение файл maximus Общие вопросы Javascript 3 17.05.2014 16:47
Помогите повторить пример (Яндекс-карт) hrundel Общие вопросы Javascript 0 19.09.2013 18:45
Пример из книги Ajax на практике Sadd AJAX и COMET 5 10.04.2010 18:20
Не работает пример использования AJAX nuker AJAX и COMET 4 19.03.2009 18:31