Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
1

Изучение JavaScript и Лексическое окружение

11.05.2016, 13:18. Просмотров 915. Ответов 26
Метки нет (Все метки)

Здравствуйте. Изучаю JS по этому материалу https://learn.javascript.ru/closures и у меня появился вопрос:

Имеется код
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
var phrase = 'Привет';
 
function say() {
 
  function go() {
    alert( phrase ); // найдёт переменную снаружи
  }
 
  go();
}
 
say();
Тут функция go() ищет у себя переменную 'phrase' и не находит её. С помощью указателя [[Scope]] функция смотрит LexicalEnvironment функции say() и тоже не находит её. Потом Она смотрит уже в глобальном объекте window и уже там она есть. Вопрос у меня такой: Если функция не находит у себя переменную, то она с помощью указателя находит другое окружение(объект) и ищет там и т.д.? То есть она умеет переходить по ссылкам? А как она это делает?

P.S. ссылки и const *(type) const =&(переменная) это одно и тоже? То есть ссылка это объект? Как в С++ или как в С? То есть указатель который не может быть изменен и с помощью которого нельзя изменить объект, на который он указывает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2016, 13:18
Ответы с готовыми решениями:

Изучение JavaScript
Интересует мнение Гуру JavaScript и тех, кто пишет всякие фишки для сайтов типа...

С чего начать изучение JavaScript
Как можно быстро и эффективно изучить язык java script и где найти уроки для...

С чего начать изучение JavaScript?
Всем привет! Думаю тема заезженная, но хочется свежих ответов пользователей....

Сайт для изучение JavaScript
Здравствуйте. Пожалуйста посоветуйте хороший сайт для изучение JavaScript от А...

Изучение HTML CSS JavaScript или не поздно ли начать в 27 лет?
Доброго времени суток, уважаемые форумчане, в общем буду краток, мне 27 (почти...

26
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
11.05.2016, 13:29 2
Тут есть такая штука как замыкания, ограничивающие область видимости то есть если бы ваша переменная была внутри say() то снаружи вы бы не смогли до нее добраться, а вот внутри например из go() без проблем.
На счет указателей, тот тут скорее все немного иначе, вы можете изменить содержимое переменной. А вот указатель(я даже не уверен что такое обозначение корректно для JS) нет.
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
11.05.2016, 14:10  [ТС] 3
Не могу понять почему работает счетчик
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function makeCounter() {
  var currentCount = 1;
 
  return function() { // (**)
    return currentCount++;
  };
}
 
var counter = makeCounter(); // (*)
 
// каждый вызов увеличивает счётчик и возвращает результат
alert( counter() ); // 1
alert( counter() ); // 2
alert( counter() ); // 3
 
// создать другой счётчик, он будет независим от первого
var counter2 = makeCounter();
alert( counter2() ); // 1
Ведь после выхода из функции переменые удаляются
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
11.05.2016, 15:12 4
Это и есть замыкания, почитайте я сам до конца не догоняю
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
11.05.2016, 15:29  [ТС] 5
Ну так я и спросил на форуме об этом так как я сам не понимаю)
0
Padimanskas
Superposition
935 / 595 / 256
Регистрация: 27.10.2013
Сообщений: 2,067
11.05.2016, 15:54 6
Цитата Сообщение от Sinkha Посмотреть сообщение
Не могу понять почему работает счетчик
потому что существует условие "достижимости" т.е. в памяти компьютера можно добраться к переменной currentCount, поэтому все объекты на пути к ней не удаляются сборщиком мусора из памяти.
https://learn.javascript.ru/memory-management
0
kalabuni
Нарушитель
3244 / 2567 / 616
Регистрация: 18.04.2012
Сообщений: 7,712
11.05.2016, 15:59 7
я как-то здесь пытался объяснить замыкания "на пальцах" -- почитайте, может быть, вам поможет
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
11.05.2016, 18:27  [ТС] 8
Все равно не понятно. Я не понимаю всего лишь 1 пример и все.
0
kalabuni
Нарушитель
3244 / 2567 / 616
Регистрация: 18.04.2012
Сообщений: 7,712
11.05.2016, 18:41 9
Цитата Сообщение от Sinkha Посмотреть сообщение
Я не понимаю всего лишь 1 пример и все.
какой именно?
вы в топе привели два примера - "с приветом" и "со счётчиком"...
какой нуждается в подробном разъяснениии?
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
11.05.2016, 19:00  [ТС] 10
Цитата Сообщение от kalabuni Посмотреть сообщение
какой именно?
вы в топе привели два примера - "с приветом" и "со счётчиком"...
какой нуждается в подробном разъяснениии?
Со счетчиком.
0
Padimanskas
Superposition
935 / 595 / 256
Регистрация: 27.10.2013
Сообщений: 2,067
11.05.2016, 19:08 11
Sinkha,
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function makeCounter() {
  var currentCount = 1; 
//при запуске этой функции в ней создается lexicalEnvironment = {currentCount: 1, scope: window}
 
  return function() {
//при запуске этой функции в ней создается lexicalEnvironment = {scope: makeCounter.lexicalEnvironment}
    return currentCount++; // через ссылку scope находим currentCount в родительском lexicalEnvironment и увеличиваем его на 1
  };
}
 
var counter = makeCounter(); // создается lexicalEnvironment
 
// каждый вызов увеличивает счётчик и возвращает результат. Верно, потому что при запуске внутренней функции создается ее lexicalEnvironment указывающий на уже созданный lexicalEnvironment родителя
alert( counter() ); // 1
alert( counter() ); // 2
alert( counter() ); // 3
 
// создать другой счётчик, он будет независим от первого. Верно, потому что при очередном запуске внутренней функции создается новый lexicalEnvironment 
var counter2 = makeCounter();
alert( counter2() ); // 1
1
kalabuni
Нарушитель
3244 / 2567 / 616
Регистрация: 18.04.2012
Сообщений: 7,712
11.05.2016, 19:49 12
очень интересно
ответьте себе всего на один вопрос -- сколько раз в приведённом отрывке кода (без создания второго счётчика counter2) происходит
присваивание var currentCount = 1; ?
подсказываю: узнать это очень и очень просто -- добавьте к этой строке инструкцию alert ('qwerty');

итак, сколько раз мы увидим окошко со строкой qwerty?
посмотрите, а потом перечитайте ваши комментарии -- и смейтесь погромче, чтобы все услышали
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
11.05.2016, 20:35 13
Padimanskas, даже я понял вроде, переменная из родителя доступна потому что она не удаляется, потому что на нее ссылается детище, как то так?
0
Padonak
Философ-разговорник
158 / 94 / 56
Регистрация: 20.02.2016
Сообщений: 369
11.05.2016, 21:24 14
Sinkha, вот еще несколько статеек по теме:

Замыкания в JavaScript

Замыкания в JavaScript(Хабрахабр)

Как работают замыкания (под капотом) в JavaScript

Последняя статья даже с иллюстрациями )
0
Padimanskas
Superposition
935 / 595 / 256
Регистрация: 27.10.2013
Сообщений: 2,067
11.05.2016, 23:11 15
Цитата Сообщение от ntlinuxnt Посмотреть сообщение
потому что на нее ссылается детище, как то так?
полностью
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
11.05.2016, 23:33 16
Цитата Сообщение от Padimanskas Посмотреть сообщение
полностью
Но вопрос в другом, где это можно применить на практике, разве что, что бы не плодить глобальные переменные. Я вот честное слово не могу понять где это можно приткнуть.
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
11.05.2016, 23:43  [ТС] 17
Постойте-ка, то есть локальные переменые не удаляются из-за того, что на них есть ссылка?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function f(){
    
    var a = 0;
    
    var k = 10;
    
    a = a + 1;
        
    return function z(d){
        
        if(d != 5){
            return k = k + 1;
        }
        else{
            return a;
        }
        
    }
        
}
    
var b = f();
 
var c = f();
 
alert(b(1));
 
alert(c(1));
 
alert(c(5));
Ни переменная "а", ни переменная "к" не удаляются из функции f() только из-за того что на эти переменные есть ссылка? Я прав?
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
11.05.2016, 23:58 18
Цитата Сообщение от Sinkha Посмотреть сообщение
Ни переменная "а", ни переменная "к" не удаляются из функции f() только из-за того что на эти переменные есть ссылка? Я прав?
Если совсем грубо то да.
0
Stas_Garcia
Ушел наливать чай
187 / 136 / 32
Регистрация: 02.03.2013
Сообщений: 652
12.05.2016, 00:03 19
Вся суть понимания замкнутости заключается в данной строчке:
CSS
1
var counter = makeCounter();// на этом этапе в области видимости возвращаемой функции формируется currentCounter=0
Здесь выполняется не присваивание переменной counter функции makeCounter, а здесь идет выполнение и запись результата функции в переменную.



Т.е. грубо говоря counter() - функция:
CSS
1
2
3
function() { // (**)
    return currentCount++;
  };
Но, "запомнившая", что currentCount=0. Весь смысл в именно возвращении функции.

Дальше:
counter() со скобками - функция. И теперь при каждом использовании этой функции переменная currentCount берется не из "currentCount=0", а из окружения этой функции, в которой хранится эта переменная.

Не вижу особых проблем с пониманием этого.

Добавлено через 2 минуты
Если вам все-еще остается не понятной эта несложная тема, то настоятельно рекомендую притормозить и вернуться к основам о понимании объекта и функции как таковой. Операциям, проводимых с функциями в особенности.
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
12.05.2016, 00:08 20
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
Но, "запомнившая", что currentCount=0. Весь смысл в именно возвращении функции.
Дальше:
counter() со скобками - функция. И теперь при каждом использовании этой функции переменная currentCount берется не из "currentCount=0", а из окружения этой функции, в которой хранится эта переменная.
Не вижу особых проблем с пониманием этого.
Короче переменной присваивается не оболочка функция, а та которая возвращается и потому что она указывает на переменную из окружения(которого по сути уже нет, оно уничтожилось) из за ссылки на эту переменную переменная не затирается, а запоминается.

Добавлено через 2 минуты
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
Если вам все-еще остается не понятной эта несложная тема, то настоятельно рекомендую притормозить и вернуться к основам о понимании объекта и функции как таковой. Операциям, проводимых с функциями в особенности.
Тут то все понятно(я про принцип работы), вопрос в том, где это можно применить по человечески.
0
12.05.2016, 00:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2016, 00:08

Вставка элементов меню (содержащих javascript) через javascript
Пишу курсовой проект по JavaScript в ходе которого потребовалось создать...

Выполнение Javascript файла в котором присутствуют javascript теги
text1.js <link...

Как перезагрузить javascript, javascript-ом?
как с помощью javascript перезагрузить javascript ? Смысл в том что один из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru