21.09.2009, 13:25
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Получается, что нет:
alert(
(function(a, b) {
return new Function('return a + b;');
})(5, 6)()
);
происходит ошибка, если бы функция создаваемая через "new Function" запоминала "a" и "b", то вывелось бы 11, как здесь:
alert(
(function(a, b) {
return function() {return a + b};
})(5, 6)()
);
Последний раз редактировалось Riim, 21.09.2009 в 13:28.
|
|
21.09.2009, 13:34
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Riim
|
если бы функция создаваемая через "new Function" запоминала "a" и "b", то вывелось бы 11.
|
И, соответственно, получилось бы замыкание...
В статье про замыкания есть такой код:
function addEvents2(divs) {
for(var i=0; i<divs.length; i++) {
divs[i].innerHTML = i
divs[i].onclick = function(x) {
return function() { alert(x) }
}(i)
}
}
Т.е. как я понял,временная функция, после исполнения, возвращает уже функцию-обработчик, которая не использует внешних [[scope]] и, соответственно, нет никакого замыкания...
Хоть бы это было так
|
|
21.09.2009, 13:39
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Сообщение от Riim
|
alert( (function(a, b) { return new Function('return a + b;'); })(5, 6)() );
|
alert(
(function() {
return new Function('a','b','return a + b;');
})()(5, 6)
);
|
|
21.09.2009, 13:40
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".
|
|
21.09.2009, 13:41
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
ZoNT,
и что, где функция созданная через "new Function" запомнила что-то замыканием?
|
|
21.09.2009, 13:46
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...
|
|
21.09.2009, 13:49
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Riim
|
Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".
|
блин, точно... Как мне создать ф-цию, передать ей аргументы и оградить от внешнего [[scope]]?
|
|
21.09.2009, 13:55
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от ZoNT
|
Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...
|
угу, в этом и был вопрос.
|
|
21.09.2009, 14:02
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Сообщение от Riim
|
угу, в этом и был вопрос.
|
Если вопрос только в этом то надо было писать так:
alert(
(function(a, b) {
return new Function('return ' + a + ' + ' + b + ';');
})(5, 6)()
);
|
|
21.09.2009, 14:05
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Это всё понятно... как передать внешнюю переменную в создаваемую ф-цию, не оставляя ссылки на scope?! Может можно как-то через prototype решить... Ну или в заранее созданную...
|
|
|
|