Вызов функции из другой функции и волшебное слово '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, время: 09:06. |