Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.09.2014, 23:47
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Сообщение от extrabass4
Но, а как тогда заранее создастся LexicalEnvironment для var sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода?
Думаю, на втором проходе. Там 2-х проходной компилятор. Я предполагаю, что первый проход делается только для того, чтобы "поднять" fuinction declarations, хотя не уверен.

Сообщение от extrabass4
оподробнее о сборщике мусора желательно с примером и алгоритмом действия.
https://developer.mozilla.org/ru/doc...ory_Management
Ответить с цитированием
  #12 (permalink)  
Старый 29.09.2014, 23:50
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Сообщение от bes
ссылки на объект закончились, можно удалять
Неправда. В js Алгоритм "Mark-and-sweep"
Ответить с цитированием
  #13 (permalink)  
Старый 29.09.2014, 23:59
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от petya
Неправда. В js Алгоритм "Mark-and-sweep"
правда, вопрос в том, что понимать под
Сообщение от bes
ссылки на объект закончились
Ответить с цитированием
  #14 (permalink)  
Старый 30.09.2014, 00:06
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Сообщение от bes
вопрос в том, что понимать под
Насколько я себе это представляю, "ссылки на объект НЕ закончились" не означает "Объект все еще нужен", в этом основная разница. А что еще можно под этим понимать?
Ответить с цитированием
  #15 (permalink)  
Старый 30.09.2014, 11:22
Интересующийся
Отправить личное сообщение для extrabass4 Посмотреть профиль Найти все сообщения от extrabass4
 
Регистрация: 25.06.2014
Сообщений: 20

спасибо, за столь интенсивную дисскусию. Постепенно всё встаёт на свои места в моей голове.

Последний раз редактировалось extrabass4, 30.09.2014 в 12:01.
Ответить с цитированием
  #16 (permalink)  
Старый 30.09.2014, 13:12
Интересующийся
Отправить личное сообщение для extrabass4 Посмотреть профиль Найти все сообщения от extrabass4
 
Регистрация: 25.06.2014
Сообщений: 20

function sayHi(person) {

var message = makeMessage(person); // (**)
alert( message );

function getHello(age) {
return age >= 18 ? 'hello' : 'hi';
}
function makeMessage() {
return getHello(person.age) + ', ' + person.name;
}
}

var say = sayHi({ name: 'LOL', age: 17 }); (*)

В этом примере функция не возвращает функцию, поэтому как я понимаю происходит следующее: как только до неё доходит интепритатор в коде (*) она сразу же выполняется и срабатывает встроенная функция alert - даже при таком вызове sayHi({ name: 'LOL', age: 17 }); в строке (*).

Но собственно,если function sayHi(person) возвращает функцию, то всё иначе:

function sayHi(person) {

return function() {
var message = makeMessage(person); // (**)
alert( message );
};

function getHello(age) {
return age >= 18 ? 'hello' : 'hi';
}
function makeMessage() {
return getHello(person.age) + ', ' + person.name;
}
}

// (*)
var call = sayHi({ name: 'LOL', age: 17 });
call();

Вызвать функцию можно только таким способом, как в (*) сперва
создав переменную ссылающуюся на функцию var call = sayHi({ name: 'LOL', age: 17 }); и передав в неё аргументы.

Но почему же нельзя просто вызвать её так sayHi({ name: 'LOL', age: 17 }); ? ведь при Function declaration имя функции sayHi это переменная ссылающаяся на функцию ?
Ведь если даже в первом примере сделать,чтоб функция return alert( message ); ? , то вызвать можно так: sayHi({ name: 'LOL', age: 17 });
Ответить с цитированием
  #17 (permalink)  
Старый 30.09.2014, 15:03
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
Ответить с цитированием
  #18 (permalink)  
Старый 30.09.2014, 16:21
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

И обрамляй код в тег JS, читать невозможно.
Ответить с цитированием
  #19 (permalink)  
Старый 30.09.2014, 18:19
Интересующийся
Отправить личное сообщение для extrabass4 Посмотреть профиль Найти все сообщения от extrabass4
 
Регистрация: 25.06.2014
Сообщений: 20

Сообщение от Dim@ Посмотреть сообщение
потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
Спасибо, а почему тогда запускается при:
Var call = sayHi({ name: 'LOL', age: 17 });
call();

Каким образом это аналог sayHi()(); ?
Ответить с цитированием
  #20 (permalink)  
Старый 30.09.2014, 19:10
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

ну для начала, я немного тупанул, чтобы вызвать alert надо написать sayHi({ name: 'LOL', age: 17 })(); а аналог тем, что
Var call = sayHi({ name: 'LOL', age: 17 });//call - ссылка на возвращаемую ф-ю
call();//её запуск
sayHi({ name: 'LOL', age: 17 })();//получение результата из sayHi т.е. ф-и и ТУТ ЖЕ её запуск
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы по учебнику extrabass4 Общие вопросы Javascript 1 12.07.2014 14:57
Вопросы от новичка по сортировке массивов и функциям iiv Ваши сайты и скрипты 3 01.07.2014 11:39
Возникли вопросы по созданию игры на javascript alex510i Общие вопросы Javascript 3 19.09.2013 16:46
Разные вопросы по элементам интерфейса от wmag -_- wmag Элементы интерфейса 12 16.08.2012 11:06