вопр. замыкание
Что-то не могу понять, зачем здесь замыкание?:
Из книги 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>
|
Это вы кэширование this в локальной переменной замыканием назвали?
|
1-ый пример:
var current = this; 2-ой пример(твой): this.tagName т.е. указывают на один и тот же объект. Этот пример из книги просто чтобы продемонстрировать что такое замыкание. |
А, ну у вас просто совпало, что в обоих контекстах this указывает на один и тот же объект. А так бы ваш вариант не работал.
|
Цитата:
Хотя, если по чесноку, то тут после вызова внешней функции , сохраняется её объект вызова, во внутреннюю ф-цию "передается ссылка на объект с локальными переменными [[scope]] внешней функции", т.е. внутренняя ф-ция теперь может в любой момент через этот объект получить локальные переменные внешней ф-ции, т.е. current. Цитата:
Цитата:
|
И да, 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);
}
|
[quote=Kolyaj;46847]И да, this замыкания плохо иллюстрирует. Хорошо их иллюстрирует навешивание обработчиков или вызов асинхронных функций в цикле
for (var i = 0; i < 3; i++) {
setTimeout(function() {
alert(i);
}, (i + 1) * 1000);
}
Да, у этих 3-х ф-ций общий объект вызова, поэтому они и на одно i ссылаются, равное 3 к концу цикла. |
| Часовой пояс GMT +3, время: 08:59. |