Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопросы по учебнику (https://javascript.ru/forum/misc/50477-voprosy-po-uchebniku.html)

petya 29.09.2014 23:47

Цитата:

Сообщение от extrabass4
Но, а как тогда заранее создастся LexicalEnvironment для var sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода?

Думаю, на втором проходе. Там 2-х проходной компилятор. Я предполагаю, что первый проход делается только для того, чтобы "поднять" fuinction declarations, хотя не уверен.

Цитата:

Сообщение от extrabass4
оподробнее о сборщике мусора желательно с примером и алгоритмом действия.

https://developer.mozilla.org/ru/doc...ory_Management

petya 29.09.2014 23:50

Цитата:

Сообщение от bes
ссылки на объект закончились, можно удалять

Неправда. В js Алгоритм "Mark-and-sweep"

bes 29.09.2014 23:59

Цитата:

Сообщение от petya
Неправда. В js Алгоритм "Mark-and-sweep"

правда, вопрос в том, что понимать под
Цитата:

Сообщение от bes
ссылки на объект закончились


petya 30.09.2014 00:06

Цитата:

Сообщение от bes
вопрос в том, что понимать под

Насколько я себе это представляю, "ссылки на объект НЕ закончились" не означает "Объект все еще нужен", в этом основная разница. А что еще можно под этим понимать?

extrabass4 30.09.2014 11:22

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

extrabass4 30.09.2014 13:12

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 });

Dim@ 30.09.2014 15:03

потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();

Erolast 30.09.2014 16:21

И обрамляй код в тег JS, читать невозможно.

extrabass4 30.09.2014 18:19

Цитата:

Сообщение от Dim@ (Сообщение 332794)
потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();

Спасибо, а почему тогда запускается при:
Var call = sayHi({ name: 'LOL', age: 17 });
call();

Каким образом это аналог sayHi()(); ?

Dim@ 30.09.2014 19:10

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


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