Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.09.2009, 13:25
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 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.
Ответить с цитированием
  #12 (permalink)  
Старый 21.09.2009, 13:34
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 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]] и, соответственно, нет никакого замыкания...
Хоть бы это было так
Ответить с цитированием
  #13 (permalink)  
Старый 21.09.2009, 13:39
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 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)
);
Ответить с цитированием
  #14 (permalink)  
Старый 21.09.2009, 13:40
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".
Ответить с цитированием
  #15 (permalink)  
Старый 21.09.2009, 13:41
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

ZoNT,
и что, где функция созданная через "new Function" запомнила что-то замыканием?
Ответить с цитированием
  #16 (permalink)  
Старый 21.09.2009, 13:46
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...
Ответить с цитированием
  #17 (permalink)  
Старый 21.09.2009, 13:49
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Riim
Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".
блин, точно... Как мне создать ф-цию, передать ей аргументы и оградить от внешнего [[scope]]?
Ответить с цитированием
  #18 (permalink)  
Старый 21.09.2009, 13:55
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от ZoNT
Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...
угу, в этом и был вопрос.
Ответить с цитированием
  #19 (permalink)  
Старый 21.09.2009, 14:02
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Сообщение от Riim
угу, в этом и был вопрос.
Если вопрос только в этом то надо было писать так:
alert(
(function(a, b) {
    return new Function('return ' + a + ' + ' + b + ';');
})(5, 6)()
);
Ответить с цитированием
  #20 (permalink)  
Старый 21.09.2009, 14:05
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Это всё понятно... как передать внешнюю переменную в создаваемую ф-цию, не оставляя ссылки на scope?! Может можно как-то через prototype решить... Ну или в заранее созданную...
Ответить с цитированием
Ответ


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

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