Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 12.11.2014, 19:24
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

может быть так понятнее будет:
func1.call1.call2(func2)

1) вызов call2
2) call2 меняет thisObj для call1 на func2
3) call2 вызывает свой thisObj – call1
4) call1 меняет thisObj для func2 на undefined (или window)
5) call1 вызывет вой thisObj – func2

Последний раз редактировалось Octane, 12.11.2014 в 19:38.
Ответить с цитированием
  #12 (permalink)  
Старый 12.11.2014, 21:29
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

xaser,
Все, до меня дошло. Это, конечно, не точно, но смысл такой
myCall=function(){return this()}
myCall.call(function(){alert("foo")})

То есть call в этом смысле, напоминает вот этот myCall.
Ответить с цитированием
  #13 (permalink)  
Старый 13.11.2014, 00:25
Новичок на форуме
Отправить личное сообщение для xaser Посмотреть профиль Найти все сообщения от xaser
 
Регистрация: 12.11.2014
Сообщений: 6

Ну мне сначала было примерно ясно как это работает, но четкой картины до сих пор нет.

Сообщение от Octane
3) call2 вызывает свой thisObj – call1
...
5) call1 вызывет вой thisObj – func2
Вот откуда тут thisObj появляется?

В спецификации call и [[Call]] насчет этого ничего не сказано. Или сказано в других пунктах? Это какое-то общее правило для взаимодействия метода с объектом?
Ответить с цитированием
  #14 (permalink)  
Старый 13.11.2014, 01:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Это какое-то общее правило для взаимодействия метода с объектом.

//Если совсем уж тупо: this'ом у метода является то, что идёт перед точкой.
__________________
29375, 35
Ответить с цитированием
  #15 (permalink)  
Старый 13.11.2014, 08:32
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Aetae
this'ом у метода является то, что идёт перед точкой.
Либо то, что передается явно через call или apply, а также аргумент, переданный через bind.
Ответить с цитированием
  #16 (permalink)  
Старый 13.11.2014, 13:33
Новичок на форуме
Отправить личное сообщение для xaser Посмотреть профиль Найти все сообщения от xaser
 
Регистрация: 12.11.2014
Сообщений: 6

Сообщение от Aetae Посмотреть сообщение
Это какое-то общее правило для взаимодействия метода с объектом.
Где об этом в спецификации почитать можно?

Последний раз редактировалось xaser, 13.11.2014 в 14:02.
Ответить с цитированием
  #17 (permalink)  
Старый 17.11.2014, 19:27
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

принцип работы call довольно прост.
Если подумать что делает этот вызов:
func1.call(obj);
Правильно, выполняет функцию func1 так как в качестве контекста у метода call указана функция func1, и соответственно он выполняет эту функцию, при этом передав в нее в качестве контекста объект obj
Пример:
function func1() {
  // здесь this это контекст
  alert(this.ololo);
}
var obj = {ololo: "ololo"};
func1.call(obj); // выполняем функцию передав контекст obj
И так, из примера выше видно что call просто выполняет функцию в контексте которой он был вызван, при этом в качестве аргумента call принимает объект в контексте которого выполнит функцию...

А теперь что же делает вариант с:
func1.call.call(func2);
в этом примере, второй call будет выполнять первый call, передав в нее необходимый контекст. А так как функция call должна принять в качестве контекста функцию, то тут второй call просто меняет контекст (функцию) у первого call и вызывает его. После срабатывает первый call и манипулирует уже с функцией переданной вторым call в качестве контекста.

PS. Что-то сдается мне, что я тоже не понятно объяснил.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #18 (permalink)  
Старый 18.11.2014, 00:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

devote, а понятно объяснить как-то не получается.
Это как "очевидно" у препода матана. Либо ты в теме и это действительно очевидно, либо не в теме и надо работать пока в голове картина не сложится. Именно "простыми словами" хрен объяснишь.)
__________________
29375, 35
Ответить с цитированием
  #19 (permalink)  
Старый 25.11.2014, 21:32
Новичок на форуме
Отправить личное сообщение для xaser Посмотреть профиль Найти все сообщения от xaser
 
Регистрация: 12.11.2014
Сообщений: 6

Ага, для всех все очевидно, но ссылку на раздел спеки, где про это почитать можно, никто дать не может

Сообщение от devote Посмотреть сообщение
в этом примере, второй call будет выполнять первый call, передав в нее необходимый контекст. А так как функция call должна принять в качестве контекста функцию, то тут второй call просто меняет контекст (функцию) у первого call и вызывает его.
Интересная терминология, "передать контекст" и "принять в качестве контекста функцию" - ну тут видимо thisObj имеется ввиду.

Последний раз редактировалось xaser, 25.11.2014 в 21:38.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Объясните как работает... Alexej Общие вопросы Javascript 12 14.03.2013 01:19
При активации Disqus, не работает Nivo slider, как решить проблему? pinkfloyd Общие вопросы Javascript 0 30.05.2011 15:29
InnerHTML почему-то работает не так, как хотелось бы. помогите Dima00782 Общие вопросы Javascript 2 13.06.2010 21:17
Как работает обработчик onMouseMove() bayah Общие вопросы Javascript 3 29.04.2010 14:36