Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   apply и call. В чём отличия? (https://javascript.ru/forum/offtopic/5156-apply-i-call-v-chjom-otlichiya.html)

Riim 21.09.2009 13:25

Получается, что нет:
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)()
);

B~Vladi 21.09.2009 13:34

Цитата:

Сообщение от 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]] и, соответственно, нет никакого замыкания...
Хоть бы это было так:)

ZoNT 21.09.2009 13:39

Цитата:

Сообщение от 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)
);

Riim 21.09.2009 13:40

Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".

Riim 21.09.2009 13:41

ZoNT,
и что, где функция созданная через "new Function" запомнила что-то замыканием?

ZoNT 21.09.2009 13:46

Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...

B~Vladi 21.09.2009 13:49

Цитата:

Сообщение от Riim
Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".

:cray: блин, точно... Как мне создать ф-цию, передать ей аргументы и оградить от внешнего [[scope]]?
:help:

Riim 21.09.2009 13:55

Цитата:

Сообщение от ZoNT
Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...

угу, в этом и был вопрос.

ZoNT 21.09.2009 14:02

Цитата:

Сообщение от Riim
угу, в этом и был вопрос.

Если вопрос только в этом то надо было писать так:
alert(
(function(a, b) {
    return new Function('return ' + a + ' + ' + b + ';');
})(5, 6)()
);

B~Vladi 21.09.2009 14:05

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


Часовой пояс GMT +3, время: 10:05.