вопросы по учебнику
Здравствуйте. Возникло пару вопросов-собственно вот они:
var arr = [1,7,8,3,7,3,22,4] function compareNumeric(a, b) { return a - b; } sort(compareNumeric);// 1 3 3 4 7 8 22 то есть алгоритм таков 1 - 7, где а это 1, а b это 7. При этом выражение 1-7 результат равен отрицательному числу и а остаётся с левой стороны, но если же было бы положительным, то они бы поменялись местами - таким способом действует эта сортировка ? Алгоритм быстрой сортировки понятен - мне ДО КОНЦА не понятно каким образом действует передаваемая функция в метод sort() |
Функция должна вернуть отрицательное число, если b должно стоять после a, положительное число, если a должно стоять после b и 0, если a и b равны. В общем, да, так и есть.
|
Спасибо за ответ. ТО есть всё основное внимание на параметр функц. a и определение его места по отношению к b элементу ?
|
Да.
|
А при function expression, ведь переменная является ссылкой ?
|
Объекты в жс передаются по ссылкам. Функция - объект, массив - объект, в общем, все, что не примитив - объект.
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
<script> var a = 0; var sayH = function() { var phrase = "Привет"; alert(phrase); } </script> До выполнения кода интерпретатор сохранит в global object(window) window = { a:undefined, sayH: undefined } Но, а как тогда заранее создастся LexicalEnvironment для var sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода? И можно поподробнее о сборщике мусора желательно с примером и алгоритмом действия. Заранее благодарен |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
спасибо, за столь интенсивную дисскусию. Постепенно всё встаёт на свои места в моей голове.
|
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 }); |
потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
|
И обрамляй код в тег JS, читать невозможно.
|
Цитата:
Var call = sayHi({ name: 'LOL', age: 17 }); call(); Каким образом это аналог sayHi()(); ? |
ну для начала, я немного тупанул, чтобы вызвать alert надо написать sayHi({ name: 'LOL', age: 17 })(); а аналог тем, что
Var call = sayHi({ name: 'LOL', age: 17 });//call - ссылка на возвращаемую ф-ю call();//её запуск sayHi({ name: 'LOL', age: 17 })();//получение результата из sayHi т.е. ф-и и ТУТ ЖЕ её запуск |
Цитата:
|
Цитата:
а если отбросить вопрос терминологии, то ты просто перебил, так как вопрос по этой формулировке должен был задать тс, а не ты, коего я не послал на гугл по этой "неосвещённой" теме только по причине того, что дал ответы на другие его вопросы в этом посте, поэтому расценивай это как - почему компиляция в байткод является компиляцией, если на выходе может получаться код, далеко не близкий к машинному? - очень просто: представь, что существует виртуальный процессор, для которого этот байткод является машинным кодом :D |
extrabass4, да
|
function makeCounter() { var currentCount = 0; // возвращаемся к функции function counter() { return ++currentCount; } // ...и добавляем ей методы! counter.set = function(value) { currentCount = value; }; counter.reset = function() { currentCount = 0; }; return counter; } var counter = makeCounter(); alert( counter() ); // 1 alert( counter() ); // 2 counter.reset(); alert( counter() ); // 1 То есть понятия метод в JS употребляется только, когда они находятся в function? и получается функция это своего рода объект судя по синтаксису: counter.set? Мне не понятно как работает return counter; каков алгоритм действий?Как я понимаю при вызове function makeCounter() создаётся его LexicalEnvironment со свойствами - LexicalEnvironment = {counter: function(){}}. При var counter = makeCounter();мы вызываем эту функцию и получаем возвращаемую return counter;(поч му не так: return counter();) ? И собственно каков алгоритм при counter.reset();как всё работает в последовательности? ТО есть function counter()теперь как объект ? обращаясь к его методу counter.reset = function()мы меняем: function counter() { return ++currentCount; } на function counter() { return currentCount = 0; } или как ? Запутался, объясните пожалуйста по шагам.... |
Цитата:
Цитата:
начни отсюда http://es5.javascript.ru/x12.html#x12.9 http://es5.javascript.ru/x15.3.html#x15.3 а скорей всего гораздо раньше и сформулируй свои вопросы соответствующе Цитата:
|
Цитата:
f=function waw(){}//f является ссылкой на (скомпилированный) объект function waw(){} o={} o.f=f//o.f является ссылкой на (скомпилированный) объект function waw(){}, т.e. тот же самый объект. Методом обычно называют ссылку типа o.f, хотя это условность, f является global.f (в браузере global -- window) Цитата:
Цитата:
foo=function(){return(yoba)} return (foo) // return получает в качестве аргумента function(){return(yoba)} return (foo()) // return получает в качестве аргумента yoba Прочувствуй эту разницу |
Цитата:
" ведь f это свойство, а о может быть не global, а находиться в функции, то есть LExicalEnviroment function makeCounter() { var currentCount = 0; // возвращаемся к функции function counter() { return ++currentCount; } // ...и добавляем ей методы! counter.set = function(value) { currentCount = value; }; counter.reset = function() { currentCount = 0; }; return counter; } var counter = makeCounter(); alert( counter() ); // 1 alert( counter() ); // 2 counter.reset(); alert( counter() ); // 1 Ведь здесь counter.set, counter.reset , не window.set и window.reset |
var makeDonkey = function() { var name = "Ослик Иа"; return { sayHi: function() { alert(name); }, yell: function() { alert('И-а, и-а!'); } }; } var donkey = makeDonkey(); donkey.sayHi(); Вопрос: Удалится ли переменная name из памяти при выполнении delete donkey.sayHi? Если нет — можно ли к name как-то обратиться после удаления donkey.sayHi? Ответ: Нет, name не удалится из памяти, поскольку несмотря на то, что sayHi больше нет, есть ещё функция yell, которая также ссылается на внешний объект переменных. Этот объект хранится целиком, вместе со всеми свойствами. При этом, так как функция sayHi удалена из объекта и ссылок на нее нет, то больше к переменной name обращаться некому. Получилось, что она «застряла» в памяти, хотя, по сути, никому не нужна. к чему свойство возвращаемого объекта yell: в данном случае ссылается через SCOPE по отношению к внешнему объекту переменных? |
не много не понимаю следующую ситуацию: функция = объект и ей можно добавлять свойства - почему в этом случае свойство функции имеет накопительный эффект :
function sayHi() { sayHi.count++; alert("Привет " + sayHi.count); } sayHi.count = 0; // начальное значение sayHi(); // Привет 1 sayHi(); // Привет 2 Тут тоже всё работает через SCope ? то есть sayHi.count - это свойство global object'a ? А в этом, нет: function sayHi() { sayHi.count = 0; // начальное значение sayHi.count++; alert("Привет " + sayHi.count); } sayHi(); // Привет 1 sayHi(); // Привет 1 |
возьми in и проверь
и вообще рассуждаешь о глобальном, а элементарный run добавить не можешь, тест сделать не можешь, оттолкнуться от формулировок спецификации не можешь, одним словом - з-л |
Цитата:
|
Цитата:
Хочешь ответов, отталкивайся от реальных вещей, аргументируя свои слова ссылками на то, откуда ты это взял. Перечитай свою тему, исправь свои ошибки и возвращайся снова ;) |
Цитата:
|
Цитата:
![]() |
Часовой пояс GMT +3, время: 04:57. |