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

extrabass4 27.09.2014 17:46

вопросы по учебнику
 
Здравствуйте. Возникло пару вопросов-собственно вот они:
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()

Erolast 27.09.2014 18:23

Функция должна вернуть отрицательное число, если b должно стоять после a, положительное число, если a должно стоять после b и 0, если a и b равны. В общем, да, так и есть.

extrabass4 27.09.2014 18:32

Спасибо за ответ. ТО есть всё основное внимание на параметр функц. a и определение его места по отношению к b элементу ?

Erolast 27.09.2014 20:44

Да.

extrabass4 28.09.2014 17:20

А при function expression, ведь переменная является ссылкой ?

Erolast 28.09.2014 18:35

Объекты в жс передаются по ссылкам. Функция - объект, массив - объект, в общем, все, что не примитив - объект.

extrabass4 28.09.2014 23:37

Цитата:

Сообщение от Erolast (Сообщение 332582)
Объекты в жс передаются по ссылкам. Функция - объект, массив - объект, в общем, все, что не примитив - объект.

А где тогда хранятся все эти функции и объекты (особенно при function expression)? Или же она не хранится, а просто выполняется когда код доходит до этого места и с массивами тоже самое, так ?

Erolast 29.09.2014 12:57

Цитата:

А где тогда хранятся все эти функции и объекты (особенно при function expression)?
Очевидно, в той области видимости, в которой объявляются. Но передаются они с помощью ссылок, прямого доступа ты к ним не имеешь. Это удобно, на самом деле.
Цитата:

Или же она не хранится, а просто выполняется когда код доходит до этого места и с массивами тоже самое, так ?
Нет, она объявляется и хранится, пока ее не удалит сборщик мусора.

extrabass4 29.09.2014 22:51

Цитата:

Сообщение от Erolast (Сообщение 332636)
Очевидно, в той области видимости, в которой объявляются. Но передаются они с помощью ссылок, прямого доступа ты к ним не имеешь. Это удобно, на самом деле.

Нет, она объявляется и хранится, пока ее не удалит сборщик мусора.

Хмм, а вот как тут тогда :
<script>
var a = 0;
var sayH = function() {
var phrase = "Привет";
alert(phrase);
}

</script>

До выполнения кода интерпретатор сохранит в global object(window)
window = { a:undefined, sayH: undefined }
Но, а как тогда заранее создастся LexicalEnvironment для var sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода?


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

bes 29.09.2014 23:46

Цитата:

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

переменная является переменной, является абстракцией и хранит значения, смысл которых (для человека) интерпретируется в соответствии с алгоритмами, описанными в спецификации

Цитата:

Сообщение от extrabass4
А где тогда хранятся все эти ... объекты

в переменной можно хранить значения-ссылки на объекты, сами объекты хранятся в куче (heap)

Цитата:

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

http://es5.javascript.ru/x11.html#x11.13.1
Цитата:

Для вычисления AssignmentExpression : LeftHandSideExpression = AssignmentExpression выполняются следующие шаги:

1. Пусть lref будет результатом вычисления LeftHandSideExpression ("Левосторонее выражение").
2. Пусть rref будет результатом вычисления AssignmentExpression.
на 2 шаге и определится в каком окружении находится функция

Цитата:

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

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

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 т.е. ф-и и ТУТ ЖЕ её запуск

extrabass4 30.09.2014 21:13

Цитата:

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

Var call = sayHi({ name: 'LOL', age: 17 }); то есть тут происходит следующее: при присваивание переменная call становиться ссылкой(Function Expression) на вложенную функцию, которая возвращается из sayHi, но к примеру если бы возвращалась не функция, а return 5+5; то переменная call хранила бы в себе результат функции 10, так?

bes 30.09.2014 21:29

Цитата:

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

это лишь вопрос терминологии: в алгоритме mark and sweep, например, ссылки на объект заканчиваются, когда до него нельзя по ссылкам добраться из глобального объекта

а если отбросить вопрос терминологии, то ты просто перебил, так как вопрос по этой формулировке должен был задать тс, а не ты, коего я не послал на гугл по этой "неосвещённой" теме только по причине того, что дал ответы на другие его вопросы в этом посте, поэтому расценивай это как хитрожопость подход типа:
- почему компиляция в байткод является компиляцией, если на выходе может получаться код, далеко не близкий к машинному?
- очень просто: представь, что существует виртуальный процессор, для которого этот байткод является машинным кодом
:D

Dim@ 30.09.2014 22:00

extrabass4, да

extrabass4 01.10.2014 22:29

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



или как ?

Запутался, объясните пожалуйста по шагам....

bes 01.10.2014 22:47

Цитата:

Сообщение от extrabass4
и получается функция это своего рода объект

Цитата:

Сообщение от extrabass4
Мне не понятно как работает return counter; каков алгоритм действий?

ты мой пост читал? ссылку на спецификацию там видел?
начни отсюда
http://es5.javascript.ru/x12.html#x12.9
http://es5.javascript.ru/x15.3.html#x15.3
а скорей всего гораздо раньше
и сформулируй свои вопросы соответствующе

Цитата:

Сообщение от extrabass4
поч� �му не так:
return counter();

догадайся с трёх раз

petya 02.10.2014 00:35

Цитата:

Сообщение от extrabass4
То есть понятия метод в JS употребляется только, когда они находятся в function?

Метод -- это свойство со ссылкой на функцию, можно так сказать. Функция в js - это первоклассный объект. На этот объект может быть много ссылок.
f=function waw(){}//f является ссылкой на (скомпилированный) объект function waw(){}
o={}
o.f=f//o.f является ссылкой на (скомпилированный) объект function waw(){}, т.e. тот же самый объект.

Методом обычно называют ссылку типа o.f, хотя это условность, f является global.f (в браузере global -- window)
Цитата:

Сообщение от extrabass4
и получается функция это своего рода объект судя по синтаксису: counter.set?

Да, в js все есть объект, семантически, по факту, примитивные типы не являются объектами, но и с ними можно обращатся как с объектами, они преобразуются в объекты, при необходимости. Функция -- это 100% объект.
Цитата:

Сообщение от extrabass4
работает return counter

Твое непонимание идет от того, что ты не можешь отличить функцию от вызова функции. допустим есть функция. Представь себе, что return - это не синтаксическая конструкция, а функция, которая получает 1 аргумент.
foo=function(){return(yoba)}
return (foo) // return получает в качестве аргумента function(){return(yoba)}
return (foo()) // return получает в качестве аргумента yoba

Прочувствуй эту разницу

extrabass4 09.10.2014 22:45

Цитата:

Сообщение от petya (Сообщение 333055)
Метод -- это свойство со ссылкой на функцию, можно так сказать. Функция в js - это первоклассный объект. На этот объект может быть много ссылок.
f=function waw(){}//f является ссылкой на (скомпилированный) объект function waw(){}
o={}
o.f=f//o.f является ссылкой на (скомпилированный) объект function waw(){}, т.e. тот же самый объект.

Методом обычно называют ссылку типа o.f, хотя это условность, f является global.f (в браузере global -- window)


Да, в js все есть объект, семантически, по факту, примитивные типы не являются объектами, но и с ними можно обращатся как с объектами, они преобразуются в объекты, при необходимости. Функция -- это 100% объект.
Твое непонимание идет от того, что ты не можешь отличить функцию от вызова функции. допустим есть функция. Представь себе, что return - это не синтаксическая конструкция, а функция, которая получает 1 аргумент.
foo=function(){return(yoba)}
return (foo) // return получает в качестве аргумента function(){return(yoba)}
return (foo()) // return получает в качестве аргумента yoba

Прочувствуй эту разницу

Спасибо большое за ответы , но не много не ясно касательно этого "Методом обычно называют ссылку типа o.f, хотя это условность, f является global.f (в браузере global -- window)
"

ведь 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

extrabass4 09.10.2014 22:53

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 по отношению к внешнему объекту переменных?

extrabass4 16.10.2014 20:22

не много не понимаю следующую ситуацию: функция = объект и ей можно добавлять свойства - почему в этом случае свойство функции имеет накопительный эффект :

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

bes 16.10.2014 22:18

возьми in и проверь
и вообще рассуждаешь о глобальном, а элементарный run добавить не можешь, тест сделать не можешь, оттолкнуться от формулировок спецификации не можешь, одним словом - з-л

extrabass4 19.10.2014 14:45

Цитата:

Сообщение от bes (Сообщение 336122)
возьми in и проверь
и вообще рассуждаешь о глобальном, а элементарный run добавить не можешь, тест сделать не можешь, оттолкнуться от формулировок спецификации не можешь, одним словом - з-л

Пожалуйста не пиши в моей теме ... Просто не могу понять таких людей как ты ! Я изучаю этот язык не так давно и поэтому мне свойственно тупить и задавать глупые вопросы. Но почему же вместо того, чтобы тыкать меня носом в ***но, нельзя как petya объснить где мое недопонимание отдельных моментов (отдельное спасибо ему)?

bes 19.10.2014 15:57

Цитата:

Сообщение от extrabass4
Пожалуйста не пиши в моей теме ... Просто не могу понять таких людей как ты ! Я изучаю этот язык не так давно и поэтому мне свойственно тупить и задавать глупые вопросы. Но почему же вместо того, чтобы тыкать меня носом в ***но, нельзя как petya объснить где мое недопонимание отдельных моментов (отдельное спасибо ему)?

Пожалуйста не пиши в своей теме, тебя тыкнули неоднократно, но тебе влом почитать то, во что тыкнули, и при недопонимании оттолкнуться в своих вопросах от этого, вместо этого ты каждый раз рассуждаешь от вакуума, делаешь те же самый ошибки, на которые тебе только что указали, и ждёшь, когда какой-нибудь петя, который это прочитал и понял вместо тебя, пожалеет тебя и будет твоей бесплатной нянькой, читающей тебе сказки на ночь и которую можно не уважать, подсовывая ей вакуумные тестовые примеры без возможности запуска.
Хочешь ответов, отталкивайся от реальных вещей, аргументируя свои слова ссылками на то, откуда ты это взял.
Перечитай свою тему, исправь свои ошибки и возвращайся снова ;)

extrabass4 24.10.2014 20:54

Цитата:

Сообщение от bes (Сообщение 336442)
Пожалуйста не пиши в своей теме, тебя тыкнули неоднократно, но тебе влом почитать то, во что тыкнули, и при недопонимании оттолкнуться в своих вопросах от этого, вместо этого ты каждый раз рассуждаешь от вакуума, делаешь те же самый ошибки, на которые тебе только что указали, и ждёшь, когда какой-нибудь петя, который это прочитал и понял вместо тебя, пожалеет тебя и будет твоей бесплатной нянькой, читающей тебе сказки на ночь и которую можно не уважать, подсовывая ей вакуумные тестовые примеры без возможности запуска.
Хочешь ответов, отталкивайся от реальных вещей, аргументируя свои слова ссылками на то, откуда ты это взял.
Перечитай свою тему, исправь свои ошибки и возвращайся снова ;)

В любом случае спасибо за такой длинный ответ, но не пиши в моих темах - твоё мнение мне не интересно.

bes 24.10.2014 21:13

Цитата:

Сообщение от extrabass4
В любом случае спасибо за такой длинный ответ, но не пиши в моих темах - твоё мнение мне не интересно.



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