2. Немного истории (Brendan Eich)
JS был обязан «выглядеть как Java», только Считайте, что JavaScript (пожалуйста, только
поменьше, быть эдаким младшим братом- не «JScript») спас вас от VBScript.
тупицей для Java. Кроме того, он должен
был быть написан за 10 дней, а иначе мы бы
Простите, времени было мало для того,
имели что-то похуже JS.
чтобы сделать правильную оптимизацию
хвостовой рекурсии. 10 дней почти без сна,
В то время мы должны были двигаться очень чтобы сделать JS с чистого листа, заставить
быстро, т.к. знали, что Microsoft идет за его «выглядеть как Java» (я сделал, чтобы он
нами. выглядел как C), и тайком протащить туда
его спасительные фишки: first class functions
(замыкания сделал позже, но они были
10 дней на то, чтобы сделать лексер, парсер,
частью плана сразу) и прототипы (примерно
компилятор в байткод (bytecode emitter),
как в языке Self).
интерпретатор, встроенные классы и
декомпилятор. Помощь была только с
файлом jsdate.c — от Ken Smith из Netscape
(который, по нашему излишне
оптимистичному соглашению, склонировал
java.util.Date — Y2K баги и т.д. тупица...).
I'll do better in the next life.
3. Еще чуть-чуть
«Самый неправильно понятый язык программирования в мире стал самым
популярным в мире языком программирования»
Дуглас Крокфорд
Первоначально язык назывался LiveScript и предназначался как для
программирования на стороне клиента, так и для программирования на
стороне сервера (там он должен был называться LiveWire).
На синтаксис оказали влияние языки Си и Java, и, поскольку Java в то
время было модным словом, 4 декабря 1995 года LiveScript
переименовали в JavaScript, получив соответствующую лицензию у Sun.
4. и еще..
Анонс JavaScript со стороны представителей Netscape и Sun состоялся
накануне выпуска второй бета-версии Netscape Navigator. В нём
декларируется, что 28 лидирующих ИТ-компаний выразили намерение
использовать в своих будущих продуктах JavaScript как объектный
скриптовый язык с открытым стандартом.
По инициативе компании Netscape была проведена стандартизация языка
ассоциацией ECMA. Стандартизированная версия имеет название
ECMAScript, описывается стандартом ECMA-262. Первой версии
спецификации соответствовал JavaScript версии 1.1, а также языки JScript
и ScriptEasy.
5. будет ли видна 'a' в коде исполняющемся в
контексте глобального объекта?
a) c)
a = 1; function(){
a = 1;
}
b)
var a = 1;
d)
var b = function (){
var a = 1;
}
6. будет ли видна 'a' в коде исполняющемся в
контексте глобального объекта?
a) c)
a = 1; function(){
Да. a = 1;
}
b) Да.
var a = 1;
Да. d)
var b = function (){
var a = 1;
}
Нет
7. что выведется в консоль?
a) c)
function a(){ var a = ( function(b){ return b; } )(“hello”);
return “hello”; console.log(a);
}
console.log(a);
d)
var a = (function(b){ return b;})(“hello”);
b) console.log( a() );
var a = function(){ return “hello” };
console.log(a());
8. что выведется в консоль?
a) c)
function a(){ var a = ( function(b){ return b; } )(“hello”);
return “hello”; console.log(a);
} Выведется “hello”
console.log(a);
Выведется код функции “a”. То же самое что d)
и при вызрове a.toString(); var a = (function(b){ return b;})(“hello”);
console.log( a() );
b) Вызовет ошибку string не функция.
var a = function(){ return “hello” };
console.log(a());
Выведется “hello”
9. что выведется в консоль при
вызове abc(); ?
var a = 234;
function abc(){
console.log(typeof a);
var a = ‘line’;
}
10. что выведется в консоль при
вызове abc(); ?
var a = 234;
function abc(){
console.log(typeof a);
var a = ‘line’;
}
Выведется undefined.
11. почему этот код не работает так
как от него “ожидают”?
function User(name) {
this.name = name;
};
var j = User('Jack');
alert(j.name);
(ожидают что j отработает как конструктор)
12. почему этот код не работает так
как от него “ожидают”?
function User(name) {
this.name = name;
};
var j = User('Jack');
alert(j.name);
Ожидают от него что в j окажется объектом
создаваемый контруктором User, но так как User вызван
без new, а User ничего не возвращает j будет
undefined, а обращение к j.name вызовет TypeError.
13. что выведет код? Почему?
Object.prototype.hello = {};
var a = [1,2,3];
for ( var number in a ) {
alert( number );
}
14. что выведет код? Почему?
Object.prototype.hello = {};
var a = [1,2,3];
for ( var number in a ) {
alert( number );
}
Код поочередно выведет четыре сообщения, в первом - 0, во втором - 1, в
третьем - 2 и в четвертом выведет hello. Это происходит потому что в
JavaScript массив это также объект, а for .. in выражение проходит по
всем свойствам объекта. Таким свойством является и hello. В number у
нас помещаются названия свойств при обходе объекта.
15. что выведет код? Почему?
(function() {
var pack = 'Jack';
})();
alert(typeof pack);
16. что выведет код? Почему?
(function() {
var pack = 'Jack';
})();
alert(typeof pack);
Выведет undefined, т.к. pack не определен, т.к.
определение pack происходит локально, и никак не
влияет на глобальный объект, в контексте которого мы
вызываем alert();
17. что выведет код? Почему?
function SuperConstructor() {
this.x = 20;
this.getX = function() { return this.x; }
}
var a = new SuperConstructor();
var f = a.getX;
console.log(f());
18. что выведет код? Почему?
function SuperConstructor() {
this.x = 20;
this.getX = function() { return this.x; }
}
var a = new SuperConstructor();
var f = a.getX;
console.log(f());
f выполняется в глобальном контексте, а не контексте объекта созданного конструктором
SuperConstructor, но f это ссылка на a.getX, поэтому вернет this.x, что тоже самое что и f.x,
который undefined.
19. а этот?
x = 5;
function SuperConstructor() {
this.x = 20;
this.getX = function() { return this.x; }
}
var a = new SuperConstructor();
var f = a.getX;
console.log(f());
20. что выведет код? Почему?
x=[];
for (var i = 0; i < 3; ++i) {
var j = i;
x.push(function () { return j; });
}
console.log(x[0](), x[1](), x[2]());
21. что выведет код? Почему?
x=[];
for (var i = 0; i < 3; ++i) {
var j = i;
x.push(function () { return j; });
}
console.log(x[0](), x[1](), x[2]());
В x будет три элемента, все они будут функциями
возвращающими 2, т.к. вызываются они в когда j = 2
22. что делать?
x = [];
for (var i = 0; i < 3; ++i){
(function (new_i) {
x.push(function () { return new_i; });
})(i);
}
23. что делать?
x = [];
for (var i = 0; i < 3; ++i){
(function (new_i) {
x.push(function () { return new_i; });
})(i);
}
т.о. в x будет три функции каждая из
которых будет возвращать свой индекс в x.
25. что выведет код? Почему?
for(var i=0;i<5;i++) {
setTimeout(function(){
alert(i);
}, 0);
}
JavaScript-код исполняется в одном потоке (event loop, UI thread).
setTimeout, откладывает выполнение функции на 0 мс. НО. Событие
таймаута произойдет только тогда, когда основной поток освободится -
цикл пройдет полностью. Код выведет 5 пятёрок. Почему пятёрок? :)
27. Что будет дальше с JavaScript?
Новые спецификации языка - новые языковые
структуры (ES6)
Новые спецификации от W3C - новые возможности
(HTML5, Canvas, Video, WebIntents, WebWorkers,
WebSockets , WebDriver, WebAudio, WebGL, Notifications
API etc)
Новые продукты - большее распространение, новые
возможности
28. Спасибо.
Дальше - вопросы и
определение тем будущих
митапов - больше :)
оптимизация, поддержка, новьё etc
rudevich@gmail.com, skype:arudevich