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