Bez oszukiwania – to znaczy, bez uruchamiania tego w przeglądarce ;)

Jaki bedzie wynik assert w poszczegolnych etapach kiedy wiadomosc jest logowana gdy condition jest false? Mozna podać pełne rozwiązanie lub zasadę :)

function assert(condition, message) {
    if(!condition) {
        console.error(message);
    }
}

assert(typeof fun === 'function', 'fun is not in scope');
assert(typeof a === 'number', 'a is not in scope');
assert(typeof b === 'number', 'b is not in scope');
assert(typeof c === 'number', 'c is not in scope');

function fun() {
    assert(typeof fun === 'function', 'IN_FUN: fun is not in scope');
    assert(typeof a === 'number', 'IN_FUN: a is not in scope');
    assert(typeof b === 'number', 'IN_FUN: b is not in scope');
    assert(typeof c === 'number', 'IN_FUN: c is not in scope');
    var b = 0;
    
    assert(typeof fun === 'function', 'AFTER_B: fun is not in scope');
    assert(typeof a === 'number', 'AFTER_B: a is not in scope');
    assert(typeof b === 'number', 'AFTER_B: b is not in scope');
    assert(typeof c === 'number', 'AFTER_B: c is not in scope');
    
    if(true) {
        assert(typeof fun === 'function', 'IN_IF_IN_FUN: fun is not in scope');
        assert(typeof a === 'number', 'IN_IF_IN_FUN: a is not in scope');
        assert(typeof b === 'number', 'IN_IF_IN_FUN: b is not in scope');
        assert(typeof c === 'number', 'IN_IF_IN_FUN: c is not in scope');
        var c = 0;
    }
    
    assert(typeof fun === 'function', 'AFTER_IF_IN_FUN: fun is not in scope');
    assert(typeof a === 'number', 'AFTER_IF_IN_FUN: a is not in scope');
    assert(typeof b === 'number', 'AFTER_IF_IN_FUN: b is not in scope');
    assert(typeof c === 'number', 'AFTER_IF_IN_FUN: c is not in scope');
}

assert(typeof fun === 'function', 'AFTER_FUN: fun is not in scope');
assert(typeof a === 'number', 'AFTER_FUN: a is not in scope');
assert(typeof b === 'number', 'AFTER_FUN: b is not in scope');
assert(typeof c === 'number', 'AFTER_FUN: c is not in scope');

var a = 0;

assert(typeof fun === 'function', 'AFTER_A: fun is not in scope');
assert(typeof a === 'number', 'AFTER_A: a is not in scope');
assert(typeof b === 'number', 'AFTER_A: b is not in scope');
assert(typeof c === 'number', 'AFTER_A: c is not in scope');

fun();

assert(typeof fun === 'function', 'AT_THE_END: fun is not in scope');
assert(typeof a === 'number', 'AT_THE_END: a is not in scope');
assert(typeof b === 'number', 'AT_THE_END: b is not in scope');
assert(typeof c === 'number', 'AT_THE_END: c is not in scope');

By kod może był czytelniejszy, tak to wygląda bez assert – //test –> 4 linijki assert dla fun, a, b i c

// test
function fun() {
    // test

    var b = 0;

    // test

    if(true) {
        // test
        var c = 0;
    }
    // test
}

// test

var a = 0;

// test

fun();

// test

3 KOMENTARZE

  1. Nie jestem mistrzem JS'a, ale wydaje mi się, że zasada wygląda tak:

    1. Wszystkie definicje zmiennych wędrują na początek danego scope'a, tyle, że są undefined aż do momentu przypisania zmiennej.
    2. Funkcja będzie zawsze widoczna (zdefiniowana) niezależnie od scope'a.
    3. Jeżeli w scope istnieje zmienna o nazwie takiej samej jak zmienna ze scope'a nadrzędnego to przesłania ona tą zmienną z uwzględnieniem pkt. 1.
    4. Zmienne są widoczne tylko "w dół" – w aktualnym scope i nested scope. Nie odwrotnie. Zmienne z wew. scope'a nie są widoczne na zewnątrz.
    5. Tutaj scope to global i fun. If(true).. to nie scope (tylko kawałek scope'a fun)

    Czyli patrząc na kod:

    // test – 1,0,0,0
    function fun() {
    // test 1,1,0,0

    var b = 0;

    // test 1,1,1,0

    if(true) {
    // test 1,1,1,0
    var c = 0;
    }
    // test – 1,1,1,1
    }

    // test 1,0,0,0

    var a = 0;

    // test 1,1,0,0

    fun();

    // test 1,1,0,0

    Jestem w trakcie lektury JS: The Definitive Guide 6th, ale nie wykluczone, że coś pomieszałem w tym przeklętym przez Boga i ludzi języku ;)

  2. nie, all ok, GRATKI :) wlasnie o to chodzilo :) -> ze func sa dostepne globalnie zas zmienna dopiero po tym jak zostana zadeklarowane. dosc ciekawa ogolnie, do tego mozna byloby sie jeszcze dopytac dlaczego powtarzam kod testu a nie zamknalem go w funkcji ;) to by troche prace nad scope poprawilo

    co do b, ciut by utrudnilo, ale nie az tak. w koncu this w fun jest window

Comments are closed.