Вопрос про scope
function fn(data){ return { get: function(){ return data; } } } var test1 = fn(1); var test2 = fn(2); alert(test1.get()); alert(test2.get()); alert(test1.get()); Собственно, почему третий alert выводит 1?! Функция одна, а локальная область всегда новая при каждом вызове?! |
Функция не одна, ты каждый раз при вызове fn создаешь:
function(){ return data; } которая и замыкает разный data. |
А разве новая функция не берёт значение из scope fn?
|
Вот ещё пример:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> </head> <body> <script type="text/javascript"> function fn(){ eval('var ' + this.name + ' = ' + this.value); alert(this.name); } fn.call({ name: 'test1', value: '1' }); fn.call({ name: 'test2', value: '2' }); </script> </body> </html> Поставьте брейкпоинт на alert. При втором вызове почему-то нет переменной test1. При вызове функции, её старый scope затирается? |
А понял о чем вопрос. Ну да каждый раз при вызове функции создается новый контекст исполнения (если не ошибаюсь в терминологии).
|
B~Vladi,
у вас сложилось превратное понимание замыканий при повторном вызове ф-ции, она не имеет понятия о пеерменных внутри нее созданных при более ранних ее вызовах. поэтому в вашем втором примере ф-ция не помнит переменную test1 Кстати, при кадом новом вызове ф-ции, создается новый [scope], а при завршении ее, убивается, если на него нету ссылок(например их созданных внутри ф-ций) поэтому в вашем первом примере, каждый вызов fn() создает новый [scope], который запоминается свежесозаднной ф-цией внутри fn() поэтому каждая из этих ф-ций помнит свой scope, и ничего не знает о чужом [scope] ф-ции -- это не что-то привязанное к самой ф-ции, а привязанное к ней, и ее одному запуску. новый запуск-новый [scope] |
Гадство. А как бы мне сделать так, чтобы я мог в уже существующий scope добавлять свои переменные?
Например есть функция: function fn(){ var test = 1; } Я в неё хочу добавить ещё одну переменную - test2 после первого выполнения fn. Другими словами - мне нужен динамический scope... Есть другой вариант - with. Вот например мы можем обращаться к document без указания window. Какие есть отличия между такими scope? Вроде получается тоже самое: var obj = { a: 1 }; with(obj){ alert(a); // 1 a = 3 } alert(obj.a); // 3 |
Цитата:
можно только менять уже определенные ранее в нем переменные. Цитата:
var obj = { a: 1 }; with(obj){ alert(a); // 1 a = 3; b=4; } alert(obj.a); // 3 alert(obj.b); // undefined вместо 4 alert(b); // 4 вместо undefined Цитата:
|
Цитата:
|
Цитата:
чем оно вам не нравится? |
Часовой пояс GMT +3, время: 21:48. |