29.09.2014, 23:47
|
Аспирант
|
|
Регистрация: 02.09.2014
Сообщений: 77
|
|
Сообщение от extrabass4
|
Но, а как тогда заранее создастся LexicalEnvironment для var sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода?
|
Думаю, на втором проходе. Там 2-х проходной компилятор. Я предполагаю, что первый проход делается только для того, чтобы "поднять" fuinction declarations, хотя не уверен.
Сообщение от extrabass4
|
оподробнее о сборщике мусора желательно с примером и алгоритмом действия.
|
https://developer.mozilla.org/ru/doc...ory_Management
|
|
29.09.2014, 23:50
|
Аспирант
|
|
Регистрация: 02.09.2014
Сообщений: 77
|
|
Сообщение от bes
|
ссылки на объект закончились, можно удалять
|
Неправда. В js Алгоритм "Mark-and-sweep"
|
|
29.09.2014, 23:59
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от petya
|
Неправда. В js Алгоритм "Mark-and-sweep"
|
правда, вопрос в том, что понимать под
Сообщение от bes
|
ссылки на объект закончились
|
|
|
30.09.2014, 00:06
|
Аспирант
|
|
Регистрация: 02.09.2014
Сообщений: 77
|
|
Сообщение от bes
|
вопрос в том, что понимать под
|
Насколько я себе это представляю, "ссылки на объект НЕ закончились" не означает "Объект все еще нужен", в этом основная разница. А что еще можно под этим понимать?
|
|
30.09.2014, 11:22
|
Интересующийся
|
|
Регистрация: 25.06.2014
Сообщений: 20
|
|
спасибо, за столь интенсивную дисскусию. Постепенно всё встаёт на свои места в моей голове.
Последний раз редактировалось extrabass4, 30.09.2014 в 12:01.
|
|
30.09.2014, 13:12
|
Интересующийся
|
|
Регистрация: 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 });
|
|
30.09.2014, 15:03
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
|
|
30.09.2014, 16:21
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
И обрамляй код в тег JS, читать невозможно.
|
|
30.09.2014, 18:19
|
Интересующийся
|
|
Регистрация: 25.06.2014
Сообщений: 20
|
|
Сообщение от Dim@
|
потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
|
Спасибо, а почему тогда запускается при:
Var call = sayHi({ name: 'LOL', age: 17 });
call();
Каким образом это аналог sayHi()(); ?
|
|
30.09.2014, 19:10
|
|
Профессор
|
|
Регистрация: 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 т.е. ф-и и ТУТ ЖЕ её запуск
|
|
|
|