Комментарии 37
Я правильно понял, что это обычный float, но вместо 2 используется 10?
Если да, то это шило на мыло.
fraction не спасет от корней, логарифмов и проч.
А так неплохо, да.
Но лучше бы просто длинную арифметику добавили.
И я думаю что не у меня одного так, но у меня не бывает ошибок с this. Да когда-то были, но из-за отсутствия статической типизации ошибки, опечатки и прочее бывают до сих пор. Поэтому this ну не самая страшная ошибка.
Самый большой прирост дают дают typed arrays… while будет быстрее for, если запуск цикла один, а потом jit оптимизирует for…
Но оказывается, что писать хорошие программы на JavaScript не только невозможно, но и не нужно.
Одна из сильнейших сторон javascript.
Во времена создания JavaScript и С системы были не слишком новороченными, поэтому создатели не подумали о том, что произойдет с их детищем в будущем.
А где ссылка на оригинал?
У меня есть подозрение, что
вместо создания обратной последовательности вызова компилятор генерирует скачок
это не совсем то, что хотел сказать автор.
По существу:
Крокфорд, конечно, голова — но в данном докладе он кое-где гонит :)
- Разве Алан Кей придумал C++, а не Smalltalk?
- Pascal сюда зачем-то сюда приплел в контексте "начала объектно-ориентированного программирования". Почему не тот же Smaltalk? Да даже C++, если верить википедии, был создан раньше, чем Object Pascal (не путаем с оригинальным Pascal, в котором объектов не было
- Консервативность в принятии новых языков разработчиками. Имхо вопрос больше в аппаратных возможностях. Высокие абстракции, как правило, требуют больше аппаратных ресурсов. Когда производительность стала позволять, разработчики стали переключаться на более высокоуровневые инструменты.
Я не использую for each. В ES5 мы получили object .keys(object). Эта конструкция дает вам хороший массив строк. И он не включает в себя вещи из цепочки прототипов, поэтому вам не нужно фильтровать результаты. Очень приятно, что я могу взять массив и выполнить for each таким образом, это действительно выразительный способ.
Douglas Crockford в видео ясно говорит "for each", но судя по контексту, он имел ввиду, что не использует "for in". Думаю, он оговорился.
Пассаж про WeakMap тоже непонятен, т.к. есть еще Map, без "слабого" названия. Что означает Weak в названии он не объяснил, только запутав слушателей.
P.S. это не претензии к переводу, просто мысли в слух.
В 1980 он наконец был опубликован. И это был лучший из разработанных языков программирования в истории — С++. Алан Кей взял идеи Simula, не совсем понял их, но перевел на C.
Что за бред? Речь явно про Smalltalk, но какое отношение он имеет к С?
Lisp? Нет, не слышал…
Похоже, скоро будет пересечение. Я не могу предсказать, когда это произойдет. Но Google может. Согласно прогнозам Google Trends это произойдет в этом году (2015 — прим. ред.). JSON наконец станет официально более интересным, чем XML.Совсем немного ошибся: пересечение двух технологий и перевес JSON зафиксированы в апреле 2016 г.
В начале объектно-ориентированного программирования мы стартовали с идеи, реализованной в Pascal, согласно которой у нас есть запись, а затем мы связываем с этой записью функции, которые являются методами, действующими на элементы записи.
Похоже, это про Оберон, а не про Паскаль. Не помню, чтобы в классическом Паскале вообще ООП было, а вот в Обероне Вирт именно так сделал.
И кстати, в Go эта идея из Оберона перетекла, Пайк где-то упоминал.
Плиз, знающие люди, объясните этот момент подробнее. Можно примером.
Чтобы понять, запустите в консоли браузера.
const obj = {};
obj['foo'] = function () {
console.log(this === obj);
console.log(this === window);
};
obj.foo(); // => true, false
const fn = obj.foo;
fn(); // => false, true
const fn = obj.foo;
fn();
равноценно
const window.fn = obj.foo;
window.fn();
Здесь наверное имелось ввиду, что контекст теряется при передаче метода из объекта в другой объект?
Нет, не равноценно. fn — локальное, оно видно только внутри блока, в котором объявленно. В случае консоли, оно, конечно, будет глобальным. Вот пример с локальной областью видимости.
(function() {
const localFoo = obj.foo;
localFoo(); // => false, true
})();
console.log(window.localFoo); // => undefined
С this все плохо, оно определяется способом вызова (про связанные функции не будем вспоминать)
localFoo(); // => false, true
контекстом будет window. Но после вызова(function() {
...
})();
информация о localFoo исчезает из области window?Тут все еще несколько хитрее. Глобальная область видимости — это поля глобального объекта, в данном случае window. Однако же localFoo не принадлежит window, это просто локально объявленная константа. Вот пример того, как мы радостно дали эту функцию другому объекту (это ровно одна и та же функция, нужно заметить), а this снова поменялся.
const obj2 = { otherFoo: obj.foo };
obj2.otherFoo(); // => false, false
this внутри функции сам по себе по умолчанию не привязан к определенному объекту, а определяется способом вызова.
Т.е. если мы вызываем функцию как метод (obj.foo()), то this будет определен как объект, содержащий поле. Но если мы вызываем функцию как функцию, то такого объекта, очевидно, нет. Но javascript в данном случае нам просто радостно подставляет глобальный объект. Это особенно раздражает в случае если передавать метод как callback. Но напрямую это сделать нельзя (this потеряется), его нужно каким-то образом привязать к правильному объекту.
С другой стороны это позволяет делать многие вещи, которые напрямую невозможны в других языках. Например, мы можем передать функцию, которая затем будет вызвана как метод другого объекта (на этом половина jQuery построена).
ошибся уровнем
The Better Parts: доклад Дугласа Крокфорда о JavaScript и языках программирования будущего с конференции .concat() 2015