Kiedy uczyłeś się JS, jaki był twój moment Aha? [Zamknięte]


16

Czy pamiętasz, kiedy uczysz się JavaScript? Jaki był moment, kiedy nagle go „dostałeś”?(Na przykład mój aha-moment CSS miał miejsce, gdy dowiedziałem się o modelu pudełkowym ...)

Pytam dlatego, że uczę się JS przez 6 tygodni, ale nadal uważam, że jest to dość mylące. Oto cytat z czegoś, co ostatnio czytałem na SO:

„..funkcje działają podobnie jak wartości, ponieważ metoda jest właściwością obiektu, który ma wartość funkcji (która jest również obiektem).”

Jestem ciekawy, czy na początku byłeś zdezorientowany i co sprawiło, że to zrozumiałeś.

(Czytam Sitepoints „Simply JavaScript”, książkę „Eloquent JavaScript” i śledzę samouczek Lynda Essential JavaScript. Nie mam doświadczenia w programowaniu i byłem okropny z matematyki;)

Dzięki!


1
Uważam, że cytat jest mylący i niejasny, i jestem szczery, i od wielu lat używam JavaScript w gniewie, więc nie jestem zaskoczony, jeśli jest mylący dla kogoś nowego w języku :)
Russ Cam

Cytat i zamieszanie nadchodzi, ponieważ ten cytat próbuje powiedzieć, że funkcje są pierwszorzędnymi obiektami w javascript. Walisz, a zapewnisz sobie źródło momentów „a-ha”: dodatkowe ramy odniesienia.
chiggsy,

Odpowiedzi:


15

Myślę, że największym momentem dla mnie było, kiedy w pełni zrozumiałem:

Zmienne wartości mogą być dowolne, łącznie z funkcjami

var person = {
    name: 'Sean',
    getName: function() { return this.name; },
    numbers: [7, 11, 41]
}

var myvar = person.name;
alert(myvar); //prints name
alert(myvar()); //"myvar" is not a function error
alert(myvar.length); //undefined

myvar = person.getName;
alert(myvar); //prints the contents of the function as a string
alert(myvar()); //calls the function
alert(myvar.length); //undefined

myvar = person.numbers;
alert(myvar); //prints contents of array
alert(myvar()); //"myvar" is not a function error
alert(myvar.length); //prints 3


10

Zgadzam się z tym, czego dotyczyły niektóre inne odpowiedzi; Momentem A-ha było dla mnie, kiedy zrozumiałem, co to było zamknięcie .

Zamieściłem odpowiedź na pytanie Co to jest zamknięcie? aby to wyjaśnić.

Bez zrozumienia zamknięć JavaScript jest dość ograniczonym językiem, z kilkoma przyjemnymi skrótami składniowymi, takimi jak []tablice i JSON ( {}dla obiektów) oraz w kontekście przeglądarki DOM ( window/ document).

Jednak po zrozumieniu zamknięć pojawia się wiele zrozumienia :

  • Czym naprawdę jest prototyp ( patrz tutaj )
  • Dlaczego prototypy są kluczem do OOP w Javascript ( patrz tutaj )
  • Jak naprawdę działa większość programów obsługi zdarzeń w JavaScript (może to wydawać się magią bez zrozumienia zamknięć)
  • Jak zaoszczędzić sobie dużo kodu (i / lub czasu) dzięki wywołaniom zwrotnym

Zasoby


4

Wydaje mi się, że najważniejszym językiem „Aha dla mnie w Javascript był

  • Funkcje jako obiekty
  • Domknięcia
  • Orientacja obiektowa oparta na prototypach
  • Określanie zakresu w JavaScript

Na wszystkie te tematy powinieneś znaleźć mnóstwo zasobów w Internecie.

(I nie sądzę, że wszystko stanie się całkowicie logiczne: JavaScript jest mylący)


Naprawdę? JavaScript jest mylące? Dla mnie wszystko wydaje się całkiem naturalne. Ale to tylko ja :-P.
Htbaa

3

javascript był dla mnie trudny, kiedy po raz pierwszy zacząłem się go uczyć kilka lat temu, ponieważ zacząłem uczyć się tworzenia stron WWW od strony serwera (php i perl).

Nie chodziło mi tak bardzo o składnię, OOP czy cokolwiek, co mi umknęło, ale o javascript napędzany na żywo i zdarzeniami - wychodząc od „zrób to i to i tamto i podaj to, a skończysz”, aby „to zrobić” i to i tamto, a następnie jesteśmy w stałym stanie oczekiwania na coś, co się wydarzy i odpowiadamy, dopóki użytkownik nie opuści strony ” To naprawdę rzuciło mnie na pętlę.

Nie sądzę, żebym mógł wymienić coś konkretnego, co naprawdę sprawiłoby, że zatonął (brak definitywnego momentu „aha!” - gdybym musiał wymienić konkretny moment, powiedziałbym, kiedy uczyłem się AJAX dla skryptu sugestii wyszukiwania, ale IMO to po prostu arbitralne), ale kiedy w końcu zrozumiałem różnicę, wszystko stało się o wiele łatwiejsze :)


Oto kilka naprawdę dobrych wskazówek, dziękuję wszystkim!

1

Kiedy w końcu zrozumiałem, że mogę przedefiniować dowolną część języka na dowolne bzdury, jakie chcę. Pod tym względem jest jeszcze bardziej wydajny niż C. Na przykład, jeśli nie podoba mi się standardowa toString()funkcja, to zaimplementuję własną:

x.toString = function () {
    return "this is MY toString function biatch!";
}

Czym tak naprawdę różni się od zastępowania?
Nicole

1

Kiedy zdałem sobie sprawę, że możesz ustawić właściwość na obiekcie funkcji.

Również kiedy w końcu zrozumiałem, czym był prototyp.

function Alpha(){
    return 'aplha';
}
Alpha.Beta = function(){
    return 'beta';
}
Alpha.prototype.Delta = function(){
    return 'delta';
}

Alpha(); // 'alpha'
Alpha.Beta(); // 'beta'
new Alpha().Delta(); // 'delta'

0
function Obj() {
    this.x = 42;
    this.value = function() {
        return this.x;
    };
}

var o = new Obj();
o.value();        // 42
var f = o.value;
f();              // undefined??

I chwila a-ha, kiedy w końcu złapiesz się na te wyniki.


0

Aha chwila nr 1, dla mnie: Zrozumienie, że JavaScript, język, różni się od jego podstawowego zastosowania: dynamicznego HTML i programowania WWW po stronie klienta. Byłbym sfrustrowany JavaScriptem, kiedy naprawdę byłem sfrustrowany z powodu DOM i niezgodności przeglądarki.

Aha moment # 2: Zrozumienie, że dziedzictwo można wykonać na wiele sposobów. Typowe dziedziczenie klasowe jest tylko jedno. Są inne, a mianowicie oparte na prototypach (styl używany w JavaScript).

W odniesieniu do nr 1 nie mogę się oprzeć poleceniu JavaScript: The Good Parts . JavaScript traktuje JavaScript jako dobry język sam w sobie.


0

Brak określania zakresu i podnoszenia bloków.

foo(); // function executes, no error

if (...) {
  function foo(){
    ...
  }
}


-1

jQuery był dla mnie momentem „a-ha”. Składnia była dobrze znana po dużym doświadczeniu ze składnią LINQ / lambda w języku C #.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.