Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.06.2010, 21:41
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Вопрос про 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?! Функция одна, а локальная область всегда новая при каждом вызове?!
Ответить с цитированием
  #2 (permalink)  
Старый 17.06.2010, 21:53
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Функция не одна, ты каждый раз при вызове fn создаешь:
function(){
	      return data;
	    }

которая и замыкает разный data.
Ответить с цитированием
  #3 (permalink)  
Старый 17.06.2010, 21:56
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

А разве новая функция не берёт значение из scope fn?
Ответить с цитированием
  #4 (permalink)  
Старый 17.06.2010, 22:11
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Вот ещё пример:
<!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 затирается?
Ответить с цитированием
  #5 (permalink)  
Старый 17.06.2010, 22:30
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

А понял о чем вопрос. Ну да каждый раз при вызове функции создается новый контекст исполнения (если не ошибаюсь в терминологии).
Ответить с цитированием
  #6 (permalink)  
Старый 17.06.2010, 22:32
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

B~Vladi,
у вас сложилось превратное понимание замыканий

при повторном вызове ф-ции, она не имеет понятия о пеерменных внутри нее созданных при более ранних ее вызовах.
поэтому в вашем втором примере ф-ция не помнит переменную test1

Кстати, при кадом новом вызове ф-ции, создается новый [scope], а при завршении ее, убивается, если на него нету ссылок(например их созданных внутри ф-ций)

поэтому в вашем первом примере, каждый вызов fn() создает новый [scope], который запоминается свежесозаднной ф-цией внутри fn()
поэтому каждая из этих ф-ций помнит свой scope, и ничего не знает о чужом

[scope] ф-ции -- это не что-то привязанное к самой ф-ции, а привязанное к ней, и ее одному запуску.
новый запуск-новый [scope]
Ответить с цитированием
  #7 (permalink)  
Старый 17.06.2010, 23:09
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Гадство. А как бы мне сделать так, чтобы я мог в уже существующий 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

Последний раз редактировалось B~Vladi, 17.06.2010 в 23:13.
Ответить с цитированием
  #8 (permalink)  
Старый 17.06.2010, 23:33
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от B~Vladi
в уже существующий scope добавлять свои переменные?
никак.
можно только менять уже определенные ранее в нем переменные.
Сообщение от B~Vladi
Есть другой вариант - with
опять таки, он позволяет работать только с уже существующими свойствами
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

Сообщение от B~Vladi
Какие есть отличия между такими scope
те, что with-это не scope
Ответить с цитированием
  #9 (permalink)  
Старый 17.06.2010, 23:39
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Gvozd
те, что with-это не scope
Да, я не правильно выразился. Мне не нужно определять несуществующие свойства... Просто хочу создать среду где было бы глобальная область видимости + мои переменные, доступные просто по имени. Пожалуй with подойдет.
Ответить с цитированием
  #10 (permalink)  
Старый 17.06.2010, 23:41
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от B~Vladi
Мне не нужно определять несуществующие свойства... Просто хочу создать среду где было бы глобальная область видимости + мои переменные, доступные просто по имени. Пожалуй with подойдет.
замыкание под эти требования все также подходит.
чем оно вам не нравится?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос: И опять про offsetLeft... sigurd Общие вопросы Javascript 11 04.10.2010 14:06
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
вопрос про <select> Krondor Общие вопросы Javascript 2 25.11.2009 17:04
Вопрос про отправку данных методом Post QQQ AJAX и COMET 1 15.07.2009 23:27
вопрос про сверхдинамичный интерфейс Гость AJAX и COMET 2 05.04.2008 01:02