var obj = {
    a: "Witaj, wiecie!",
    b: 42,
    c: true
};

obj.a;      // "Witaj, wiecie!"
obj.b;      // 42
obj.c;      // Prawda
obj["a"];   // "Witaj, wiecie!"
obj["b"];   // 42
obj["c"];   // Prawda

* * * * * * * * * * *
var obj = {
    a: "Witaj, wiecie!",
    b: 42
};

var b = "a";

obj[b];         // "Witaj, wiecie!"
obj["b"];       // 42

* * * * * * * * * * *
var arr = [
    "Witaj, wiecie!",
    42,
    true
];

arr[0];         // "Witaj, wiecie!"
arr[1];         // 42
arr[2];         // Prawda
arr.length;     // 3

typeof arr;     // "object"

* * * * * * * * * * *
function foo() {
    return 42;
}

foo.bar = "Witaj, wiecie!";

typeof foo;         // "function"
typeof foo();       // "number"
typeof foo.bar;     // "string"

* * * * * * * * * * *
var a = "Witaj, wiecie!";
var b = 3.14159;

a.length;               // 11
a.toUpperCase();        // "WITAJ, WIECIE!"
b.toFixed(4);           // "3.1416"

* * * * * * * * * * *
var a = "42";

var b = Number( a );

a;              // "42"
b;              // 42 -- to liczba!

* * * * * * * * * * *
var a = "42";

var b = a * 1;  // Tutaj zachodzi niejawna koercja "42" na 42.

a;              // "42"
b;              // 42 -- to liczba!

* * * * * * * * * * *
var a = "42";
var b = 42;

a == b;         // Prawda
a === b;        // Fasz

* * * * * * * * * * *
var a = [1,2,3];
var b = [1,2,3];
var c = "1,2,3";

a == c;     // Prawda
b == c;     // Prawda
a == b;     // Fasz


* * * * * * * * * * *
var a = 41;
var b = "42";
var c = "43";

a < b;      // Prawda
b < c;      // Prawda

* * * * * * * * * * *
var a = 42;
var b = "foo";

a < b;      // Fasz
a > b;      // Fasz
a == b;     // Fasz

* * * * * * * * * * *
var a = 2;

foo();                  // To wywoanie dziaa, poniewa mamy do czynienia
                        // z hoistingiem deklaracji 'foo()'.

function foo() {
    a = 3;

    console.log( a );   // 3

    var a;              // Hoisting deklaracji zmiennej
                        // na pocztek funkcji 'foo()'.
}

console.log( a );   // 2


* * * * * * * * * * *
function foo() {
    var a = 1;

    function bar() {
        var b = 2;

        function baz() {
            var c = 3;

            console.log( a, b, c ); // 1 2 3
        }

        baz();
        console.log( a, b );        // 1 2
    }

    bar();
    console.log( a );               // 1
}

foo();

* * * * * * * * * * *
function foo() {
    a = 1;  // Zmienna 'a' nie zostaa formalnie zadeklarowana.
}

foo();
a;          // 1 -- Ups! Automatycznie utworzona zmienna globalna :(

* * * * * * * * * * *
function foo() {
    var a = 1;

    if (a >= 1) {
        let b = 2;

        while (b < 5) {
            let c = b * 2;
            b++;

            console.log( a + c );
        }
    }
}

foo();
// 5 7 9

* * * * * * * * * * *
if (a == 2) {
    // Dowolne zadanie
}
else if (a == 10) {
    // Inne zadanie
}
else if (a == 42) {
    // Jeszcze inne zadanie
}
else {
    // Rozwizanie awaryjne
}

* * * * * * * * * * *
switch (a) {
    case 2:
        // Dowolne zadanie
        break;
    case 10:
        // Inne zadanie
        break;
    case 42:
        // Jeszcze inne zadanie
        break;
    default:
        // Rozwizanie awaryjne
}

* * * * * * * * * * *
switch (a) {
    case 2:
    case 10:
        // Uyteczne zadanie
        break;
    case 42:
        // Inne zadanie
        break;
    default:
        // Rozwizanie awaryjne
}

* * * * * * * * * * *
var a = 42;

var b = (a > 41) ? "witaj" : "wiecie";

// Dziaanie podobne do poniszego:

// if (a > 41) {
//    b = "witaj";
// }
// else {
//    b = "wiecie";
// }

* * * * * * * * * * *
function foo() {
    "use strict";

    // Ten kod dziaa w trybie cisym.

    function bar() {
        // Ten kod dziaa w trybie cisym.
    }
}
// Ten kod nie dziaa w trybie cisym.

* * * * * * * * * * *
"use strict";

function foo() {
    // Ten kod dziaa w trybie cisym.

    function bar() {
        // Ten kod dziaa w trybie cisym.
    }
}

// Ten kod dziaa w trybie cisym.

* * * * * * * * * * *
function foo() {
    "use strict";   // Wczenie trybu cisego.
    a = 1;          // Brakuje sowa kluczowego 'var', 
                    // wic nastpuje zgoszenie bdu ReferenceError.
}

foo();

* * * * * * * * * * *
function foo() {
    // ..
}

* * * * * * * * * * *
var foo = function() {
    // ..
};

var x = function bar(){
    // ..
};

* * * * * * * * * * *
 (function IIFE(){
    console.log( "Witaj!" );
})();
// "Witaj!"

* * * * * * * * * * *
function foo() { .. }

// Najpierw mamy odwoanie do wyraenia funkcji 'foo',
// a nastpnie nawiasy () powoduj jej wykonanie.
foo();

// Wyraenie funkcji IIFE,
// a nastpnie nawiasy () powoduj jej wykonanie.
(function IIFE(){ .. })();

* * * * * * * * * * *
var a = 42;

(function IIFE(){
    var a = 10;
    console.log( a );   // 10
})();

console.log( a );       // 42

* * * * * * * * * * *
var x = (function IIFE(){
    return 42;
})();

x;  // 42

* * * * * * * * * * *
function makeAdder(x) {
    // Parametr 'x' jest zmienn wewntrzn.

    // Funkcja wewntrzna add() uywa zmiennej 'x',
    // a wic zawiera "domknicie".
    function add(y) {
        return y + x;
    };

    return add;
}

* * * * * * * * * * *
// Zmienna 'plusOne' otrzymuje odwoanie do funkcji wewntrznej 'add(..)'
// wraz z domkniciem poprzez parametr 'x'
// funkcji zewntrznej 'makeAdder(..)'.
var plusOne = makeAdder( 1 );

// Zmienna 'plusTen' otrzymuje odwoanie do funkcji wewntrznej 'add(..)'
// wraz z domkniciem poprzez parametr 'x'
// funkcji zewntrznej 'makeAdder(..)'.
var plusTen = makeAdder( 10 );

plusOne( 3 );       // 4  <-- 1 + 3
plusOne( 41 );      // 42 <-- 1 + 41

plusTen( 13 );      // 23 <-- 10 + 13

* * * * * * * * * * *
function User(){
    var username, password;

    function doLogin(user,pw) {
        username = user;
        password = pw;

        // Pozostay kod odpowiedzialny za obsug logowania
    }

    var publicAPI = {
        login: doLogin
    };

    return publicAPI;
}

// Utworzenie egzemplarza moduu 'User'
var fred = User();

fred.login( "fred", "12Battery34!" );

* * * * * * * * * * *
function foo() {
    console.log( this.bar );
}

var bar = "global";

var obj1 = {
    bar: "obj1",
    foo: foo
};

var obj2 = {
    bar: "obj2"
};

// --------

foo();              // "global"
obj1.foo();         // "obj1"
foo.call( obj2 );   // "obj2"
new foo();          // undefined

* * * * * * * * * * *
var foo = {
    a: 42
};

// Utworzenie zmiennej 'bar' i poczenie jej z 'foo'
var bar = Object.create( foo );

bar.b = "Witaj, wiecie!";

bar.b;      // "Witaj, wiecie!"
bar.a;      // 42 <-- delegacja do 'foo'

* * * * * * * * * * *
if (!Number.isNaN) {
    Number.isNaN = function isNaN(x) {
        return x !== x;
    };
}

* * * * * * * * * * *
function foo(a = 2) {
    console.log( a );
}

foo();      // 2
foo( 42 );  // 42

* * * * * * * * * * *
function foo() {
    var a = arguments[0] !== (void 0) ? arguments[0] : 2;
    console.log( a );
}

* * * * * * * * * * *
var el = document.getElementById( "foo" );