Javascript.RU

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

Вызов функции из другой функции и волшебное слово 'this'
Здравствуйте!
Мой вопрос состоит из двух частей...
К примеру, имеется простейшая страничка:
<html>
  <head>...</head>
  <body>
    <div id="box" style="background-color: red;">Text...
      <input type="button" value="X" />
    </div>
  </body>
</html>
И к ней подключен *.js-файл (с использованием регистрацией событий по W3C) такого плана:
document.getElementsByTagName("input")[0].addEventListener("click", hide, false);
function hide() {
  this.style.display = "none";
}
Понятное дело, желаемого эффекта в виде скрытия div#box по нажатию на кнопку 'X' мы не достигнем, т.к. ключевое слово 'this' относится к "обладателю" функции, а именно - к самой кнопке. Вроде бы и функция универсальная (т.е. не зависит от контекста), но всё плохо...
Посдкажите, как в данном случае сохранить универсальность функции и тип регистрации событий, только чтобы всё работало?
---
Вторая часть вопроса заключается в том, как быть в ситуации, если я, например, хочу задержать выполнение функции в вышеописанной ситуации на 300мс(?):
function delay() {
  var temp = setTimeout("hide()",300);
}
function hide() {
  this.style.display = "none";
}
Здесь, также результат отрицательный, т.к. указатель 'this' направлен на функцию delay(). Как пользовать 'this', если функция вложена в функцию?
---
P.S. Приведенные выше примеры, написаны для наглядности. Меня интересует решение проблем в общем, а не частном случае.
P.P.S. Заранее благодарен всем!

Последний раз редактировалось JackScore, 13.10.2010 в 18:47.
Ответить с цитированием
  #2 (permalink)  
Старый 01.10.2010, 15:43
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

http://javascript.ru/basic/closure
Ответить с цитированием
  #3 (permalink)  
Старый 01.10.2010, 17:33
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

function changeColor( color ) {
    this.style.color = color;
}
var main = document.getElementById("main");
changeColor.call( main, "black" ); // this в этом контексте будет отноститься к main

function setBodyColor() {
    changeColor.apply( document.body, arguments );
}

setBodyColor( "black" ); // this в этом контексте будет отноститься к doucment.boyd

это вам для примера как сделать this независимым!

Последний раз редактировалось HelpeR, 01.10.2010 в 17:37.
Ответить с цитированием
  #4 (permalink)  
Старый 01.10.2010, 18:35
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

большое спасибо!
теперь остается выяснить, в чём отличие между методами call и apply...
а в виде аргументов этим методам можно передавать функции или нет?

Последний раз редактировалось JackScore, 01.10.2010 в 18:38.
Ответить с цитированием
  #5 (permalink)  
Старый 01.10.2010, 18:43
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от JackScore
а в виде аргументов этим методам можно передавать функции или нет?
Можно, конечно
Ответить с цитированием
  #6 (permalink)  
Старый 01.10.2010, 19:40
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

Сообщение от HelpeR Посмотреть сообщение
это вам для примера как сделать this независимым!
Ок, а если к этому добавить желание передать функции параметры, полученные от другой функции, которая их получила, в свою очередь, от пользователя при вызове?
Говоря подробней:
test1(1,5,8)
function test1(a,b,c) {
  ...
  test2(a,b,c);
}
function test2(x,y,z) {
  x++;
  y++;
  z++;
}
Как сделать так, чтобы test2 получила/увидела исходные a=1, b=5, c=8 (кроме как сделать их копию в test1 и отправить дальше)?
Ответить с цитированием
  #7 (permalink)  
Старый 01.10.2010, 21:57
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

В качестве второго параметра .apply можно указывать не менее магический, чем this, объект arguments:
function foo(a, b, c){
alert(this.baz + "\r\n" + a + "\r\n" + b + "\r\n" + c)
}
var bar = new Object();
bar.baz = 42;
bar.xyzzy = function(){
foo.apply(this, arguments)
};
bar.xyzzy(1, 2, 3);
Ответить с цитированием
  #8 (permalink)  
Старый 13.10.2010, 19:08
Новичок на форуме
Отправить личное сообщение для JackScore Посмотреть профиль Найти все сообщения от JackScore
 
Регистрация: 01.10.2010
Сообщений: 7

я немного туплю насчет locking...
вот есть у нас объект:
var Action = {
  init: function(a,b,c) {
    Action.sum(a,b,c);
  },
  sum: function(a1,b1,c1) {
    d = a1+b1+c1;
    return d;
  }
}
и пользователь говорит
Action.init(1,5,6)
Как реализовать call/apply в контексте объекта и его методов? или Как организовать передачу исходных значений от одного метода другому?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции родителя из iFrame bushstas Общие вопросы Javascript 6 13.08.2013 14:43
Вызов функции, находящейся в другой функции ZneP Events/DOM/Window 6 24.08.2010 18:45
непонятный вызов функции hedgi Общие вопросы Javascript 2 05.08.2010 11:55
вызов функции из функции sharp_007 Общие вопросы Javascript 2 03.04.2010 21:13
Вызов функции из другой функции.. ?? glutton Общие вопросы Javascript 3 21.08.2009 22:33