Вызов функции из другой функции и волшебное слово '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. Заранее благодарен всем! |
|
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 независимым! |
большое спасибо!
теперь остается выяснить, в чём отличие между методами call и apply... а в виде аргументов этим методам можно передавать функции или нет? |
Цитата:
|
Цитата:
Говоря подробней:
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 и отправить дальше)? |
В качестве второго параметра .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);
|
я немного туплю насчет 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, время: 06:17. |