Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вызов функции из другой функции и волшебное слово 'this' (https://javascript.ru/forum/events/12122-vyzov-funkcii-iz-drugojj-funkcii-i-volshebnoe-slovo-%27%27.html)

JackScore 01.10.2010 15:40

Вызов функции из другой функции и волшебное слово 'this'
 
Здравствуйте!
Мой вопрос состоит из двух частей...:help:
К примеру, имеется простейшая страничка:
<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. Заранее благодарен всем!

Octane 01.10.2010 15:43

http://javascript.ru/basic/closure

HelpeR 01.10.2010 17:33

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 независимым!

JackScore 01.10.2010 18:35

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

Sweet 01.10.2010 18:43

Цитата:

Сообщение от JackScore
а в виде аргументов этим методам можно передавать функции или нет?

Можно, конечно

JackScore 01.10.2010 19:40

Цитата:

Сообщение от HelpeR (Сообщение 72721)
это вам для примера как сделать 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 и отправить дальше)?

subzey 01.10.2010 21:57

В качестве второго параметра .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);

JackScore 13.10.2010 19:08

я немного туплю насчет 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 в контексте объекта и его методов? или Как организовать передачу исходных значений от одного метода другому?


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