Академический Документы
Профессиональный Документы
Культура Документы
Javascript Noshadow
Javascript Noshadow
Подзаголовок
Александр Мочёнов
Вопросы
1
Я не буду говорить о
• DOM
• Истории JS и его будущем
• Регулярных выражениях, Таймерах
• Подробно о Массивах
• Конвеншенах
• И многом другом ...
2
А лучше раскажу о
• О feature’ах
• О том, о чём кто-то может не знать
• О том почему JavaScript - клёвый
3
Факты и мысли
String()
Number()
Object()
Boolean()
... etc
5
Объекты
var cat = {
actions:{
sleep: function(){ cat.status = "sleeping"; },
eat: function(){ cat.status = "eating"; },
clean_wc: function(){ cat.status = "cleaning wc"; }
},
"do": function(action){
if( this.loves.has(action) ){
this.actions[action]();
}else{
throw {name:"Cat Exception", message:"Br-r-r!"};
}
}
};
cat["do"]("clean_wc");
>>> Uncaught #<an Object>
6
for ... in
var budget = {
beer : 1250,
sandwich : 500,
pizza: 670
};
var sum = 0;
for(item in budget){
if(budget.hasOwnProperty(item)){
sum += budget[item];
}
}
assert(sum === 2420);
7
Функции
обычные объекты
function talk(buddy){
return "I talk with " + buddy + " for " +
talk.long + " minutes";
};
talk.long = 5;
8
Функции - создание
var twiceTen = getTwice(10); //Can use it before declaration
// - Function as Expression
function getTwice(value){
return value * 2;
};
assert(twiceTen === 20);
// - Function as statement
var pub = function priv(param){
//param, and priv are visible only here.
};
pub(111); //Can use it after declaration.
9
Анонимная функц.
10
arguments
var argArr = function(args){
return Array.prototype.slice.apply(args);
};
11
Вызов функции
простой и метод
function simpleFunction(){
//this => global object
return "simple value";
};
assert(simpleFunction() === "simple value");
var obj = {
value: "simple value",
method: function(){
//this => parent object
return this.value;
}
};
assert(obj.method() === "simple value");
12
Вызов функции
псевдо-конструктор
14
Вызов функции
var DeathStar = function (){
this.enemy = "Rebel Alliance";
this.shoot = function(){
return "Shoot " + this.enemy + " with superlaser";
};
};
16
Scope
var globalVar = 10;
function one(){
var innerVar = 10;
function two(){
var innerInnerVar = 10;
noVarVar = 10;
assert(globalVar === innerVar &&
innerVar === innerInnerVar);
}
assert(globalVar === innerVar);
//innerInnerVar - not in this scope
two();
}
one();
//Only global variables is in this scope
assert(globalVar === noVarVar);
17
(function(){})();
var letters = ["D","E","V","C","L","U","B"];
var sayArr = [];
for(var i = 0; i < letters.length; i++){
sayArr.push(function(){
return "Say " + letter[i] + "!";
});
}
18
(function(){})();
var letters = ["D","E","V","C","L","U","B"];
var sayArr = [];
for(var i = 0; i < letters.length; i++){
sayArr.push(function(){
return "Say " + i + "!";
});
}
19
(function(){})();
var letters = ["D","E","V","C","L","U","B"];
var sayArr = [];
for(var i = 0; i < letters.length; i++){
(function(k){
sayArr.push(function(){
return "Say \"" + letters[k] + "\" !";
});
})(i);
}
for(var j = 0; j < sayArr.length; j++){
console.log(sayArr[j]());
}
//Say "D" !
//Say "E" !
//Say "V" !
//...
20
(function(){})();
var letters = ["D","E","V","C","L","U","B"];
var sayArr = [];
for(var i = 0; i < letters.length; i++){
sayArr.push(
(function(i){
return "Say \"" + letters[i] + "\" !";
})(i)
);
}
for(var j = 0; j < sayArr.length; j++){
console.log(sayArr[j]());
}
22
(function(){})();
var yourLib = (function(){
var i = 10;
var b = 20;
function innerLib(c){
return c + i + b;
};
return innerLib;
})();
//i, b not visible here
assert(yourLib(30) === 60);
23
Closure
I’m gonna build my own amusement park. With ...
24
Closure - guess number
function makeGame(){
var theNumber = Math.round(Math.random() * 10);
var numberOfGuesses = 0;
return function(guess){
numberOfGuesses++;
if(guess == theNumber){
return "You did it in " + numberOfGuesses + " tries";
}else{
return "No. My number is " +
(guess < theNumber ? "bigger" : "smaller");
}
};
};
var tryToGuess = makeGame();
tryToGuess(3); // --> No. My number is bigger
tryToGuess(7); // --> No. My number is smaller
tryToGuess(5); // --> You did it in 3 tries
25
Closure - fibonacci
var count = 0;
var fibonacci = function fib(n){
count++;
return n < 2 ? n : fib(n - 1) + fib(n - 2);
};
26
Closure - fibonacci
var count = 0;
var fibonacci = (function(){
var memo = [0, 1];
var fib = function (n){
count++;
var result = memo[n];
if (typeof result !== 'number'){
result = fib(n - 1) + fib(n - 2);
memo[n] = result;
}
return result;
};
return fib;
})();
28
Наследование
29
Prototype
function Monkey(){};
var codeMonkey = new Monkey();
function Vasja(){};
Vasja.prototype = new Monkey();
30
Наследование
• Прототипное наследование
• Классическое, типа Классы и всё такое
• Функциональное
• Подробнее расскажет Вася.
31
Дополнения к примитивам
Array.prototype.map = function(fn){
for(var i = 0, size = this.length; i < size; i++){
this[i] = fn.call(this[i], i, this);
}
return this;
};
32
Кэширование метода
Function.prototype.cached = function(){
var _cache = {};
var fun = this;
return function(){
var args = argArr(arguments);
var result = _cache[args];
if(!result){
result = fun.apply(null, args);
_cache[args] = result;
}
return result;
};
};
33
Кэширование метода
Function.prototype.cached = function(){
...
var count = 0;
var fibo = function (n){
count++;
return n < 2 ? n : fibo(n - 1) + fibo(n - 2);
}.cached();
34
Вкусненькое
scope var
var APP = {
constants: {
MAX_BUK: 10,
MIN_BUK: 20
},
messages: {
hello_world: "Hello World",
cancel: "Cancel"
},
sayHello: function(){
return this.messages.hello_world;
}
};
35
Вкусненькое
использование && и || в выражениях
var work = {
doing: function(){ return "hard working"; }
};
assert(action() === "hard working");
36
Вкусненькое
falsy values
37
Вкусненькое
evil twins == и ===
38
Вкусненькое
evil twins
39
Вкусненькое
null, parseInt, IEEE 754, NaN
//null
var nullable = null;
assert(typeof nullable === 'object');
assert(nullable === null);
//pasreInt
assert(parseInt("08") === 0); //Octal
assert(parseInt("08", 10) === 8); //Decimal
//IEEE 754
assert(0.1 + 0.2 !== 0.3);
//NaN
var notANum = NaN;
assert(typeof notANum === 'number');
assert(notANum !== notANum);
assert(isNaN(notANum));
40
Вкусненькое
brackets style
function iLikeCStyleBrackets()
{
return
{
word:"boo-gaga"
}
}
var s = iLikeCStyleBrackets();
//assert(s.word === "boo-gaga"); //Makes error
assert(s === undefined);
41
Вкусненькое
brackets style
function iLikeCStyleBrackets()
{
return;
{
word:"boo-gaga"
};
};
42
Вкусненькое
brackets style
function iUseGoodBrackets(){
return {
word:"good boy"
};
};
var s = iUseGoodBrackets();
assert(s.word === "good boy");
43
Книги
JavaScript: JavaScript:
JavaScript Ninja The Definitive Guide
The Good Parts
JavaScript – это клёва!
Спасибо!
Александр Мочёнов
soswow@gmail.com