>> Okej, så i dag, Jag kommer att tala
om JavaScript och hur det är skiljer sig från andra språk
att du kan vara brukade gilla PHP.
Så i den sista föreläsningen på Måndag, pratade vi lite
om vad som är liknande, vad är bekant mellan JavaScript
och PHP eller Python eller Ruby eller C eller andra språk
att du redan bekant med.
Men Javascript det faktiskt har en riktigt unik ta
på objektmodell som gör det slags helt olika
än de flesta språk som du kommer att ta itu med.
Så fungerar är en sorts
av undervärderade koncept i JavaScript.
De är långt mer kraftfull än de är i andra språk
eftersom de kan i - för en anledning,
de är kan vara in som värden.
Så här har vi var x är lika med funktionen
och det är ett första klass värde som kan föras
runt som ett argument.
Så du behöver inte deklarera funktionen x
och bara använda x i denna omfattning.
Du kan passera värdet för x var som helst i hela, du vet,
som ett argument i en annan funktion
där du kan modulen exportera som David nämns i nod.
Så nästa punkt är
att en funktion är en invändningar i JavaScript.
Så du kan faktiskt ställa egenskaper som värden
på en funktion och bara behandla det tycker att det är ett objekt.
Så när du arbetar med jQuery, ni vet, dollar som
och då du passerar en väljare i det
och anropa den som en funktion.
Men då du också har dollar dot AJAX.
Och som inte sortens vettigt om du tror
av en funktion på samma sätt som att vara något du kan åberopa
eller ring.
Men JavaScript kan du ange egenskaper på funktioner
som statiska egenskaper med bara x dot someProp
som jag påpekade det.
Nästa punkt som vi är gå in lite mer
på djupet är det faktum att kan behandlas funktioner
som klasser i JavaScript.
Så det är konceptet av denna nya operatör
vilket skapar en ny instans av funktionen tillsammans med ett slags
av liknande klass-liknande kropp som kommer tillsammans med den
och vi kommer att gå in i det lite mer,
det kallas prototypen.
Och det är vad är märken JavaScript väldigt unik jämfört
till andra språk , som är klassbaserade
JavaScript är en prototyp baserad.
Och sedan bara på botten där,
Funktionen kan bara anropas tydligt som vi är vana vid.
Så det är inget nytt.
En annan sak som är unikt är
att matriser är faktiskt föremål.
De är inte som de är i PHP
där du bara skapa en ny array.
Detta är faktiskt en förkortning för att säga ny array.
Och array är faktiskt en underklass av ett objekt.
Så det är något annorlunda och jag ska gå
in lite mer detalj på det.
Och felsökningsfunktioner
med JavaScript är verkligen oöverträffad så vitt jag har sett.
Detta är en skärmdump av Chrome Inspector
som vi ska att använda för resten
av presentationen i dag.
Och för att få till detta, du bara gå till fil utvecklingsverktyg
och öppna Chrome Inspector eller så kan du högerklicka
och klicka på show inslag jag tycker att det är på HTML-sida
eller jag tycker det är kommandot Alternativet J öppnar detta.
Men vi ska gå in i det här och du kan faktiskt ställa brytpunkter
när du kör igenom JavaScript-koden och sortera
för att utvärdera vad den lokala variabler är, vad värdet
på detta är och det gör det sätt lättare att felsöka kod.
Och inte - det är inte begränsad till webbläsaren sidan kod
men du kan faktiskt köra en instans
av denna krom inspektör för din servicesidan kod
vilket är riktigt snyggt eftersom du kan stega igenom rad för rad
som en begäran kommer in i ditt server och se vad som händer
och leka med variablerna i konsolen här nere.
Så som jag nämnde, JavaScript är ett prototypbaserat språk
vilket innebär att det finns en uppsättning av standardvärden som sorterar
dolda för varje funktion
i objekt dot prototyp egendom.
Så det är typ av en hash av bara olika standardvärden
att när du anropar en fungera med den nya sökord,
de som ställs in av standard som funktioner
, som finns tillgängliga på instans.
Så det är egentligen riktigt effektivt för -
det är ett effektivt sätt att skapa objekt minne klokt
eftersom JavaScript runtime behöver bara hålla reda
av prototypen av objektet.
Den pekar på den sortens
när man cretae en ny instans av en klass.
Och du kan också härma arv som är känt
i klassbaserade språk där du sorterar
av som en här sträcker sig det, sträcker sig att du kan härma
att i JavaScript genom vad som kallas den
prototypkedja.
Och vi får se exempel på om det.
Så om din - jQuery plugins faktiskt de rekommenderar jQuery
författare att använda dollar prick fn att lägga till funktioner
till jQuery biblioteket.
Och vi faktiskt kommer att hoppa till - Så på denna sida,
Vi har dollarn - Jag ingår jQuery.
Och om du gör dollar dot i konsolen
som jag nämnde att föra du upp genom kommandot shift J
eller bara att välja Visa, Utvecklare, Utvecklarverktyg
och gå till fliken Källor.
[Ohörbart Anmärkning]
Oh säker. Så när jag började för att skriva i en variabel,
det är auto-klar för mig vad som finns där.
Så jag skrev i dollar och jag kan se Jag tror att Chrome har några
inbyggd dollar, dollarn och dollarn x.
Så just nu vill jag bara dollar och jag satte på en punkt.
Och då visar mig alla egenskaper
, som finns tillgängliga på jQuery objektet.
Men om jag gör dollar dot prototyp,
Jag ser nu alla metoder att jag är van vid att använda
när jag har dollarn, väljaren och sedan kedja jag bort det med,
ni vet, lägger klass eller lägga eller oskärpa eller något liknande.
De är alla faktiskt på prototypen
som under huven jQuery skapar en ny instans av sig själv
och det slags döljer alla dessa uppgifter från dig.
Så den punkt att jag var gör tillbaka hit
med funktionen, de faktiskt dölja prototyp från dig
och bara alias den till dollarn dot fn.
Så de flesta människor faktiskt inser inte
att det finns en prototyp Under huven that -
att du kan utnyttja och lägga till ytterligare funktioner
till varje jQuery instans om du vill.
Så den "nya" operatör är egentligen sorts svårt
att förstå i början.
När du ringer en funktion med "nya",
det är en helt annan sätt att anropa funktionen
som om du bara kallas det tydligt.
Så den "nya" operatör skapar vad som kallas en ny instans
av ett föremål eller en ny exempel på, kan du tänka
av objektet som klass.
Och när detta händer, värdet av detta som kan vara bekant
med från jQuery, de slags in detta
till vad som är praktiskt vid den tidpunkten.
De satt oftast den till nuvarande DOM-nod som du är
på när du går igenom som varje eller något liknande.
De - Detta värde är tänkt att vara värdet av förekomst
som du skapade med "nya", som omfattar allt
på prototypkedjan och alla av de metoder som du skulle finna
som prototypegenskaper.
Så det beror på hur en funktion anropas,
vad värdet av detta är.
Och det är verkligen förvirrande Om du är ny till JavaScript.
Men varje funktion som kallas har en - har vid detta värde.
Så även om du inte har skapat en ny instans av något,
att detta förutsätts att vara global.
Eller så kan du ringa en funktion med hjälp av samtalsmetoden
där tillämpa metoden i JavaScript.
Du kan funktion och specificera vad det borde vara.
Så du kan göra det dynamiskt, vilket är riktigt kraftfull
men också tillåter dig att göra saker som kan vara vilseledande
och förvirrande att andra utvecklare
om de inte använder det faktum.
Och jQuery, jag vill hävda gör det ännu mer förvirrande
genom att göra det bekvämt och ställer in det
till den aktuella DOM-nod.
Men den enkla regeln att komma ihåg vad värdet av detta är
när du letar
vid en funktionell samtalstaxa det som är kvar av pricken.
Så om du har ett objekt
och det är något prick någonting är funktionen
att du ringer då den första värdet är vad värdet
av detta är.
Så här är ett kodexempel
där jag skapar en ny objektlitteral
vilket är precis det objekt skapats med klammerparenteserna
och jag sätta namn till Bob
och då har jag en sayName metod här som -
så inne i detta sayName om jag x dot sayName,
värdet av detta är lika till x, eftersom den vänstra
om punkten är x. Så om Jag kallar det x dot sayName,
det skulle säga Hej Bob.
Och sedan ett annat exempel
där jag faktiskt tilldela x dot sayName, vars funktion
till variabeln Y, vilket som jag nämnde
i JavaScript dig kan tilldela funktioner
till variabler när du vill, det är verkligen flexibelt på det sättet,
men nu när jag ringer Y, det har förlorat samband med x.
Så detta är nu globala eller om du är i strikt läge,
Jag tror att det är null eller odefinierat.
Men - So Y är inte vad du är förväntar sig här om du letar
på x och du ska att ringa sayName,
du väntar detta namn är tänkt att vara Bob.
Men om du klarade det objektet och kallade det
av sig själv, är detta nu global.
Och det är vad jag nämna när du ser dollar dot detta,
man ofta inte tänker på vad som egentligen händer.
Men jQuery slags har sin egen domän-specifika språk
för att hantera detta och det är inte vad du är van
i JavaScript.
Och jag påpeka detta eftersom det är verkligen viktigt
för att skriva välstrukturerade objektorienterad kod
i JavaScript för att verkligen ha en god förståelse och grepp
på hur det fungerar och hur objektmodellen fungerar
och hur den nya operatören fungerar.
Annars kommer du sluta upp med jQuery spagetti
där allt är typ av överallt
och bara att göra med DOM.
Om du kan faktiskt skriva JavaScript
på ett mer strukturerat sätt, det gör det mycket enklare
att arbeta med, för att sortera av separera den oro
för att hantera de uppdatering av DOM och hantera
med den faktiska logik och kod.
Så låt oss ta en titt på en några exempel kring det.
Så jag har några exempel här.
Så det här är bara ett enkelt exempel för att använda ett JavaScript-objekt
och lägga till några funktioner till den och sedan skapa sortera
av som en miniatyr ansökan.
Så det är väldigt enkelt egentligen.
Det enda som den gör är först det frågar ditt namn.
Så jag ska säga Tim och sedan kan ändra ditt namn till Bob.
Och det är allt det här program gör.
Men vad jag skulle vilja peka ut är hur den gör det.
Så jag har detta namn generator objekt som har en startmetod
som ber användaren för deras namn
genom att bara kalla detta askForName
vilken här ner gör en snabb
Om namnet inte fick då frågar den för det igen
genom att ringa detta askForName.
Och sedan när det blir namnet, det kallar denna uppdatering namn.
Så här ställer sedan användarens namn i h1-taggen.
Och om namnet inte är set, kastar ett fel.
[Ohörbart Anmärkning]
Oh säker. Så det sätter användarens namn i h1-taggen
genom att ringa setDisplayName som ställer in HTML
i JS namn behållaren och Jag prefix alla mina HTML
med JS väljare bara för att det är en god vana att komma
in bara för att göra det inte så svår
när du använder väljare som ID-s eller klasser
för både stil och logik
i din JavaScript front end-applikationer.
För om du har olika grupper av människor som arbetar
på kodbas och du har en väljare där
att konstruktören bestämmer att ändras på grund Det är -
ser inte bra ut, så de vill att sätta i en ny klass och ta
ut din och du är beroende om det för JavaScript ändamål,
då din kod bryts.
Det är bra att prefix och sortera
av liknande namnrymden nästan JavaScript-relaterade klasser
eller attribut med ett prefix av JS.
Så det här är ganska enkelt och du kan se
i alla dessa fall Jag är ringer tillbaka detta i slutet.
Så detta är en bra vana att komma in,
för att ge dig en giltig returvärde.
I askForName Jag är inte eftersom det är vettigt
att du skulle få namn tillbaka.
Men vad som gör att du göra då
Om du kommer tillbaka den här uppdateringen namnge, det åter värdet
av setDisplayName vilket är returnera värdet av denna.
Och det gör att du kan sortera av kedjan som du är van
i jQuery genom att returnera värdet av detta varje gång.
Detta hänvisar till den aktuella objekt
så man kan kalla den här punkten askForName dot setDisplayName
och det skulle hålla värdet av detta och att du
ha en trevlig kedja där.
Och sedan - så i detta andra exempel.
[Paus]
Okej.
OK. Så låt oss gå vidare och öppna konsolen
och gå till min fliken Källor.
Vi kommer att poppa ut det här faktiskt.
Så i Chrome utvecklaren verktyg som jag nämnde,
det är denna pjäs på höger och en -
du kan se den här stoppskylt även som standard, det är svart.
Men när du för muspekaren över det, det säger "Inte paus på undantag.
Klicka på paus på alla undantag. "
Och när du klickar på den igen, visar det blå.
Och nu när det det finns ett fel som kastas
i din JavaScript-kod, det ska stanna vid den punkten och att du
för att utvärdera vad som händer.
Så - Och det är verkligen en användbar Konceptet handlar om att påpeka.
Och sedan om du klickar på återigen visar det lila
och detta är normalt vad jag håller den i.
Det bryter bara koden när det finns ett undantag
det har inte gripits.
Så många gånger i jQuery för exempel de försök fångster
för att testa om en webbläsare eller inte har någon form av förmåga
och fortsätta därifrån.
Det är endast när det finns ett fel
som inte har varit fångad i ett försök fångst.
Så låt oss försöka skicka ett namn som är tom.
Så jag kan se att koden är nu stoppad
vid updateName metod och jag kan musen över namn
och se att det är tomt till tomt.
Där är det lika tomt.
Så om inte namnet kasta en ny fel och nu kan jag ta ett steg tillbaka
genom funktionen kolumn och säga, "OK,
var kom det ifrån, "och se vad värdet av kunden är.
Så det har askForName metod,
setDisplayName start och updateName.
Och detta är bara en riktigt användbar sätt kan du se ha alla
variabler som är tillgängliga i den omfattning samt
som nedläggningsvariabler, så allt som är stängt
över av denna funktion.
Och så jag kan se det - vad värdet av kunden är
och vad värdet av detta är.
Så det här för vi är i jQuery är lika
till den aktuella DOM-element.
Men det är verkligen användbart för felsökning av kod
att bryta på fel som detta.
Ett annat särdrag hos Chrome Inspector är
som när som helst kan du klicka på de olika linjerna
i rad och det ska bryta på de platser
där du har ställt brytpunkter de är att hänvisas till som.
Så om jag klickar på den linjen blir blå.
Så låt mig fortsätta utförande här, OK, bröt det.
Och nu ska vi sätta namn till Alice och slå in.
Så nu kan jag se ännu innan det kom till en punkt
att uppdatera allt, det är nu slutade här så jag kan se
att mitt detta namn är Alice och sedan kan jag fortsätta -
låt mig ladda om sidan.
Okej, så nu när det är början vid start igen,
det har slutat på detta linje och jag kan se
det namnet är för närvarande odefinierad.
askForName är vilken funktion det är, så det är också ofta användbart
om du har funktioner som är som kommer från olika filer
eller olika platser i kod kan du se var det är,
och sedan hoppa till det, det kommer att belysa den.
Så bra att få en vana att använda felsökningsverktyg
det är inte bara trösta dot log.
OK, så låt oss ta en titta på ett andra exempel
vilket gör mer nytta av prototyper som jag hade nämnt till.
Så i det här exemplet
vi skapar en ny Funktionen heter CS
och detta är aktiverade så konventionen standarden
i JavaScript är om en Funktionen är tänkt att användas
som konstruktör, till skillnad
till bara en vanlig funktion, kapitalisera du det.
Så jag har kapital CS och detta tar en variabel courseId
och courseTitle som Jag satt på denna courseId,
denna courseTitle i konstruktorn.
Och då jag satt också studenter och föreläsningar som tomma matriser.
Så anledningen till att du -
OK, så prototypen fastigheter sedan definierade
här nere med - så mall är bara en enkel streck
mall, ett understreck mall är ett sätt att du kan -
liknar de mallar att David hade nämnt
på servern, kan du bara skriva ett script-tagg
vilket inte är en JavaScript manus utan en text HTML
och vad jag gör med jQuery är -
det håller inte dessa öppen, ja, det går vi.
Med jQuery, det börjar bli det HTML-värdet för denna mall
och sedan köra den genom stryka bibliotek nyttighets
mall motor.
Så dokumentationen för det är här nere
under bruksmallen
men i grund och botten kan du läsa lite mer om det.
Men det utvärderar strängen och omvandlar den till en funktion
som vi kan sedan skicka data in och det kalla dynamiskt.
De följande två metoder jag har är addStudent och addLecture.
Dessa bara lägga till dem i interna arrayer som jag har fastställts
i konstruktorn och därefter render metoden.
Så, låt oss skapa det nya instans av CS ringde 164
som har den här kursen nummer 164 och titel.
Och sedan CS50 som har CS50 och intro till CS1
och sedan lägga till några lectures studenter
och sedan ringa CS50 återge.
Och om jag kör koden, så Jag gör det med Eval.
Du har aldrig riktigt vill använda Eval, men jag är bara typ
att ta alla de JavaScript som är här inne
och köra den i farten.
Det gör i detta mall dessa nya instanser
av CS-klass som har egenskaper, så vi har gått
igenom och gjort addLecture och addStudent till varje.
Och som jag nämnde för att jag återvänder här,
Jag kan faktiskt kedja dessa addLecture och addStudent samtal
och det kommer att fungera lika bra.
Den andra funktionen i JavaScript det är ännu mer användbar
på serversidan där du verkligen vid en viss tidpunkt
Om din ansökan blir större vet inte var du är
och det är svårare att ställa in dessa enskilda brytpunkter
som jag nämnde i Chrome Inspector är
att använda debugger nyckelordet.
Så det är bara D-E-B-U-G-G-E-R.
Och när du sätter en debugger sökord i koden
och du har - där går vi, två Gs.
När du sätter debugger sökord i koden
och du kör en debugger
såsom krom Inspector här
eller serversidan Chrome Inspektör, berättar den JavaScript
för att stoppa exekvering på den linjen av koden och sedan kan du
att stega igenom resten av exekveringen av koder.
Så om jag klickar på kör-kod här, det är nu stannar
vid denna debugger linje och jag kan se OK, här är värdet för CS50
och det är en fick kurs titel, kurs-ID,
den har inga föreläsningar, inga studenter.
Och då kan jag gå igenom hela addLecture,
Jag kan se det är att trycka på dessa föreläsningar,
musen över det, "Hello World".
Jag kan faktiskt i konsolen gör detta så detta är satt
till det aktuella objektet att du befinner dig i.
Denna föreläsning är "Hello World".
Och hålla stepping igenom så mycket som jag vill.
Om jag inte vill kliva
in i ett funktionsanrop "orsak Jag vet vad som händer
att göra att gå in addLecture, det finns den här knappen här
som säger "Steget över till nästa funktionsanrop, "och så jag kan gå
till punkten var jag kanske undrar över något.
Som till exempel 164 gör.
Så på denna punkt, är det kommer att göras.
Jag kan se den här mallen är den kompilerade mallen.
Jag kan se på denna punkt jag bör ha två studenter
och två föreläsningar.
Och sedan finns det prototypen kedja som jag syftade på.
Så standard en som kommer tillsammans med bara ett objekt
i JavaScript i allmänhet,
den kommer med två sträng värdet av konstruktören.
Och då de som Jag har lagt på mig själv
med addLecture, addStudent och därefter egenskaperna
som är unika för denna instans av klassen
eftersom det åberopades med det nya nyckelordet.
Så låt oss göra en enda fler exempel på denna
och sedan ska vi gå till vissa mer intressanta saker
på serversidan.
Så låt oss gå vidare och öppna det sista exemplet som är -
låt oss se, var är koden?
Jag vet inte var det gick.
OK, bra, vi skulle bara hoppa över denna kod sedan faktiskt -
oh hålla på, jag tror jag missade formatmallen för koden.
OK, så låt oss göra detta lite större.
I detta exempel visar jag lite mer på inställningen
upp prototypkedjan,
så inrätta arv med JavaScript.
Så i detta fall, vi har en katalog som kommer
att förmodligen upprätthålla flera kurser.
Och så en katalog har en addCourse metoder.
Så det kontrollerar om kursen som har gått i är en instans
naturligtvis som åberopas med det nya nyckelordet.
Så om du försöker skicka
i något annat, det kommer att skrika på dig.
Det gör metoden som kommer gör var och en av kurserna
genom att sammanställa sin mall nedan.
Och vi har kursen som tillgång
i detta fall basklassen för individuella avdelning kurser.
Och i stället för att var och en
Kursens prick prototyp dot metod
eller egendom med hjälp av sträcka hjälpare i streck biblioteket
att sortera samtals förlänga denna prototyp med alla
av dessa egenskaper, vilket är användbart, lite lättare att läsa.
Och så här nere att göra vad som kallas inställning
upp i prototypkedjan.
Så detta är faktiskt lite knepigt att människor först
och även fortfarande ha gjort detta ett tag, är det slags svårt
att linda huvudet runt.
Men låt inte det skrämma dig.
Så jag sätta upp ett nytt -
en helt ny klass invända här, CS.
Och i konstruktorn,
Jag säger naturligtvis tillämpa detta argument.
Så argument är en speciell värde Jag antar att man kan kalla det
i JavaScript, det sökord som har allt
av allt som är skickas vidare är argument
denna funktion finns tillgängliga med argumenten ringa,
med argument nyckelordet.
Så när jag ringer med kurs dot tillämpas,
detta är det aktuella sammanhanget med vilken CS som kallas.
Så när jag åberopa den med nya det är en - det är ett värde på CS.
Och jag säger kalla detta kursmetoden här uppe.
Åh förlåt - kalla detta Naturligtvis metoden här
men ange värdet av detta att oavsett värde
på detta är just här.
Så det gäller nyckelordet tillåter du slags förändra tillståndet
av denna vilket är hur jQuery är tillåtet att sortera av brytare
ut detta på dig som du går igenom
och göra ett DOM-element istället för jQuery objektet.
Så nu ska jag ställa en tillfällig funktion
som kommer att ta tag i prototyp av kursen.
Och sorts ställa in den dess prototyp
och ställ sedan in prototypen på CS funktionsobjekt
till en ny instans av det.
Så i princip är jag säga i stället -
om jag här nere gjorde CS prick prototyp är lika ny kurs.
Då skulle det vara ringer allt
i denna konstruktorfunktionen,
som jag inte skulle nödvändigtvis ville.
Så allt jag gör är sorts skapa nästan
som en surrogat-funktion som kommer att ha kurser prototyp
på den och typ av härma prototypen -
kursen, men utan att göra allt i konstruktorn
och ställa det till prototypen.
Och då är jag bara lägga så avdelningen
i det här fallet är datorn Vetenskap för CS-objektet.
Och då har jag en slags bro version av att göra det.
Det fungerar inte i IE9.
Så det är därför jag ville ha att visa sorts hur -
vad detta gör under huven.
Men du kan ställa in den upp på samma sätt
där Econ lika funktion Naturligtvis gäller dessa argument
och sedan säga Econ dot prototyp är lika med objekt dot CreateCourse
dot prototyp.
Så det skapar ett nytt objekt som är bara prototyp
för kursen och sedan ställa den avdelning där.
Så nu ska vi bara gå in en debugger här och klicka på sikt.
Så där.
Så CS164 vi kan se prototypkedja som vi har fått
egenskaper som var som i konstruktorn.
So värden av dessa som var inställd och sedan på prototypkedjan
för CS-objektet den hade avdelning Datavetenskap set.
Och sedan på den underliggande prototypkedja,
vi då ha alla metoder och egenskaper
som är unika för maträtten objektet.
Och sedan har vi basta föremål.
Så den typen av en snabb exempel på prototypkedjan.
Och som ni kan se här, där är två värden per avdelning.
Så det finns avdelningen för datavetenskap
och sedan avdelningen inte listad som jag sa
som standardvärde här.
Så prototypkedjan är faktiskt bara en för sig
länklista.
Och som den försöker att hitta en fastighet,
det börjar på toppnivå värde.
Så vad är det som definieras i konstruktorfunktionen
och sedan sorts gå ner prototypkedjan från det.
Så för att det finns, så -
om just här, säger jag CS50 dot Department,
det ska säga datavetenskap.
Men om jag säger var -
[Paus]
Men om jag säger humaniora är lika med ny kurs
och då säger jag humaniora dot-avdelningen,
Jag ser avdelningen som inte anges eftersom den gick till först -
Jag kan titta på prototypen kedja här faktiskt.
Så det gick först till kursen invändningar och såg det finns inget
på prototypkedjan vid denna nivå för departementet
eller för de värden avdelning så då den hoppar till nästa nivå,
kursen och utseende vidarebefordra dit och finner det.
Så det är bara ungefär som går ner uppifrån och ner
och det blir liksom något som är unikt
om JavaScript är att du kan ändra
av dessa värden vid varje given tidpunkt.
Så i konstruktorn eller i ett enskild metod på objektet
om jag vill ställa in detta avdelning till något nytt,
eller om jag ens vill ställa någon av dessa funktioner
som redan existerar
till något nytt, Jag är fri att göra det.
Så just nu har jag CS50 prick addLecture, ser ut som det.
Och om jag vill ställa in den på CS50 addLecture precis lika
till tomt funktion.
Sen nu kan jag se att det är bara helt förändrats
som du inte kan att göra en annan språk
där du har en striktare klass baserat arv
och allt är slags inrättas.
JavaScript är väldigt, väldigt flexibel när det gäller det.
OK, låt oss hoppa tillbaka i bilderna.
Så om du till exempel skulle alltid ha en funktion
ha en viss detta värde satt för den.
Du kan ringa funktion dot binder
och ange vad värdet av detta bör vara.
Du kan se det som -
"Jag försöker att tänka på en goda exempel från verkliga livet, men ",
Om du vill skydda din kod
mot någon potentiellt kalla det med ett värde
det skulle inte vara här.
Som till exempel AJAX callback som överskott eller fel.
De är vanligtvis inte kallas
med en god semantisk värdet av detta.
Och du är som, "OK, jag alltid vill att detta ska vara det värde
Kursens objektet som jag arbetar med.
Eller den uppfattning som jag är arbetar med i min kod
som representerar denna DOM-nod, kan du ställa in -
du kan binda sammanhang att denna och sedan när det kallas senare
av jQuery och den inte har en bra värde på detta det ska hålla
vad du avgränsas den med.
Sedan finns funktionsanrop var du kan ange sammanhanget
och ange en variabel antal argument.
Och så finns det funktion gäller som du kan skicka
i samband med och sedan antingen en matris
eller de argument invänder att Jag nämnde som du ser där.
Och argumenten i alla funktion som du ringer,
Du kan bara skriva in ordet "argument"
och det kommer att ha alla argumenten.
Den har en "längd" egendom
vilket är hur maj argument var faktiskt gått till att metoder
sedan i JavaScript du kan sortera på samtal
med variabelnummer av argument.
Det är användbart för att säga om detta hade ett argument,
följ sedan denna kod väg.
Om det hade två, kanske du vill följa en annan väg.
Det gör att du kan ha riktigt dynamiska API: er för dina metoder.
Du kan tänka på att med jQuery
som när du har dollar prick på eller binda.
Och den sortens gör olika saker
på om du sätter en argument eller två eller tre
eller börjar det med en funktion.
Det är med hjälp av de argument egenskap
och argumenten längd i många fall
att ha denna magi funktionalitet hända.
De saker som du inte kan göra med argument är att använda det bara
som standard som en matris.
Så du kan säga argument tre och ställ in den på något
som du kan använda arrayen tilldelning.
Du kan använda den - mycket av streck metoder
för antingen samlingar eller för att arbeta med matriser,
du kan skicka in argument och det kommer att inse
att det är ett argument objekt och sortera
för att ta hand om det åt dig.
Men om du vill använda argument som skickas
genom en funktion som en matris,
du kan använda understreck dot två array.
En av antalet av nyttofunktioner
som bygger på att understryka.