Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.03.2010, 01:30
Аватар для Shaci
:-/
Отправить личное сообщение для Shaci Посмотреть профиль Найти все сообщения от Shaci
 
Регистрация: 28.09.2009
Сообщений: 1,126

вопр. замыкание
Что-то не могу понять, зачем здесь замыкание?:
Из книги jQuery Подробное руководство по продвинутому JavaScript
"Пример выводит имя тега и значение атрибута id текущего элемента,
создавая замыкание, после этого выводится значение атрибута id элемента, для которого предназначено событие."

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html id="greatgreatgrandpa">
  <head>
    <title>DOM Level 0 Bubbling Example</title>
    <script type="text/javascript" src="../scripts/jquery-1.2.1.js">
    </script>
    <script type="text/javascript">
      $(function(){
        $('*').each(function(){
          var current = this;
          this.onclick = function(event) {
            if (!event) event = window.event;
            var target = (event.target) ?
                         event.target : event.srcElement;
            say('For ' + current.tagName + '#'+ current.id +
                ' target is ' + target.id);
          }
        });
      });

      function say(text) {
        $('#console').append('<div>'+text+'</div>');
      }
    </script>
  </head>

  <body id="greatgrandpa">
    <div id="grandpa">
      <div id="pops">
        <img id="vstar" src="vstar.jpg"/>
      </div>
    </div>
    <div id="console"></div>
  </body>
</html>



Можно же так, и вроде нет в этом криминала:
<script type="text/javascript">
      $(function(){
        $('*').each(function(){
          //var current = this;
          this.onclick = function(event) {
            if (!event) event = window.event;
            var target = (event.target) ?
                         event.target : event.srcElement;
            say('For ' + this.tagName + '#'+ this.id +//замыкание не требуется
                ' target is ' + target.id);
          }
        });
      });

      function say(text) {
        $('#console').append('<div>'+text+'</div>');
      }
    </script>
Ответить с цитированием
  #2 (permalink)  
Старый 05.03.2010, 08:31
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Это вы кэширование this в локальной переменной замыканием назвали?
Ответить с цитированием
  #3 (permalink)  
Старый 05.03.2010, 08:35
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,578

1-ый пример:
var current = this;

2-ой пример(твой):
this.tagName

т.е. указывают на один и тот же объект.
Этот пример из книги просто чтобы продемонстрировать что такое замыкание.
Ответить с цитированием
  #4 (permalink)  
Старый 05.03.2010, 08:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А, ну у вас просто совпало, что в обоих контекстах this указывает на один и тот же объект. А так бы ваш вариант не работал.
Ответить с цитированием
  #5 (permalink)  
Старый 05.03.2010, 12:02
Аватар для Shaci
:-/
Отправить личное сообщение для Shaci Посмотреть профиль Найти все сообщения от Shaci
 
Регистрация: 28.09.2009
Сообщений: 1,126

Сообщение от Kolyaj Посмотреть сообщение
Это вы кэширование this в локальной переменной замыканием назвали?
Ну вообще говоря, да
Хотя, если по чесноку, то тут после вызова внешней функции , сохраняется её объект вызова, во внутреннюю ф-цию
"передается ссылка на объект с локальными переменными [[scope]] внешней функции", т.е. внутренняя ф-ция теперь может в любой момент через этот объект получить локальные переменные внешней ф-ции, т.е. current.

Сообщение от micscr Посмотреть сообщение
1-ый пример:
var current = this;

2-ой пример(твой):
this.tagName

т.е. указывают на один и тот же объект.
Этот пример из книги просто чтобы продемонстрировать что такое замыкание.
просто пример такой, что из него не видно логики использования замыкания, т.к. можно и без него обойтись

Сообщение от Kolyaj Посмотреть сообщение
А, ну у вас просто совпало, что в обоих контекстах this указывает на один и тот же объект. А так бы ваш вариант не работал.
угу
Ответить с цитированием
  #6 (permalink)  
Старый 05.03.2010, 12:08
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

И да, this замыкания плохо иллюстрирует. Хорошо их иллюстрирует навешивание обработчиков или вызов асинхронных функций в цикле
for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        alert(i);
    }, (i + 1) * 1000);
}


for (var i = 0; i < 3; i++) {
    (function(index) {
        setTimeout(function() {
            alert(index);
        }, (index + 1) * 1000);
    })(i);
}
Ответить с цитированием
  #7 (permalink)  
Старый 05.03.2010, 12:21
Аватар для Shaci
:-/
Отправить личное сообщение для Shaci Посмотреть профиль Найти все сообщения от Shaci
 
Регистрация: 28.09.2009
Сообщений: 1,126

[quote=Kolyaj;46847]И да, this замыкания плохо иллюстрирует. Хорошо их иллюстрирует навешивание обработчиков или вызов асинхронных функций в цикле
for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        alert(i);
    }, (i + 1) * 1000);
}

Да, у этих 3-х ф-ций общий объект вызова, поэтому они и на одно i ссылаются, равное 3 к концу цикла.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03
хитросплетения Global,контекст,this,Reference kefi Общие вопросы Javascript 109 20.11.2009 23:34
Замыкание - это... Zeroglif Общие вопросы Javascript 11 06.03.2009 22:04