├── README.md
├── Week1
├── code
│ ├── part1.js
│ └── part2.js
├── docs
│ └── introduction_js.md
└── readme.md
├── week2
├── code
│ ├── coercion.md
│ ├── this.js
│ └── thisreduce.js
├── docs
│ ├── 1.Scope.md
│ ├── 2.ExecutionContext.md
│ ├── coercion.md
│ └── readme.md
├── drafts
│ ├── Closure.md
│ ├── Objects.md
│ ├── Prototypes.md
│ ├── Scope(Global-Function-Block).md
│ ├── call-apply-bind.md
│ ├── es6 class.md
│ ├── executioncontext&callstack.md
│ ├── iife.md
│ └── readme.md
└── iife.md
├── week3
├── code
│ ├── examples.html
│ ├── index.html
│ ├── readme.md
│ └── scripts
│ │ ├── attributes.js
│ │ ├── events.js
│ │ ├── examples.js
│ │ ├── manipulating.js
│ │ ├── readme.md
│ │ ├── selectingElements.js
│ │ ├── style.js
│ │ └── traversing.js
├── drafts
└── drafts3
│ ├── DOM Attributes.md
│ ├── Keyboard Events.md
│ ├── LoadAndCustomEvent.md
│ ├── Manipulating Style.md
│ ├── ModulePatterns.md
│ ├── Selectors.md
│ ├── Traversing DOM with JavaScript.md
│ ├── Understanding-DOM.md
│ ├── createlement-appendchild-textcontent-innerhtml.md
│ ├── mouse events.md
│ └── readme.txt
└── week4
├── arraymethods.js
├── async.js
├── class.js
├── code.js
├── movies
├── index.html
├── scripts
│ ├── data.js
│ ├── helpers.js
│ └── main.js
└── style.css
├── prototype.js
└── rest.js
/README.md:
--------------------------------------------------------------------------------
1 | # Bootcamp Homepage
2 |
3 | ## WEEK 1
4 |
5 | ### Resources
6 | - [Introduction to Js](https://github.com/81-javascript-bootcamp/bootcamp-homepage/blob/main/Week1/docs/introduction_js.md)
7 |
8 | ### Code
9 | - [Introduction to Js](https://github.com/81-javascript-bootcamp/bootcamp-homepage/blob/main/Week1/docs/introduction_js.md)
10 |
11 | ### Further Learning
12 | - [Introduction to Js](https://github.com/81-javascript-bootcamp/bootcamp-homepage/blob/main/Week1/docs/introduction_js.md)
13 |
--------------------------------------------------------------------------------
/Week1/code/part1.js:
--------------------------------------------------------------------------------
1 | // Value
2 | // 1, true, "hello", function(){}
3 |
4 | // Variable
5 | var hello;
6 | console.log(hello);
7 | let foo = "Hello World";
8 | foo = "Başka bir şey";
9 | const bar = "Hello World!";
10 | //bar = "Başka bir değer";
11 | let firstName = "John"
12 | const API_KEY = "sadasdnaskldanskdasnkdkasnd"
13 | // const PI = 3.14
14 | const car = {model: "Porsche", type: "Sports"};
15 | car.model = "BMW";
16 | //let firstName
17 | //let FIRSTNAME
18 |
19 |
20 | // Primitive values - Reference Values
21 | // typeof
22 | // primitive values
23 | // - number
24 | // - string
25 | // - boolean
26 | // - undefined
27 | // - null
28 | // - symbol
29 |
30 | // reference values
31 | // - objects
32 | // - arrays
33 | // - functions
34 |
35 | let number = 30;
36 | let isOkay = true;
37 | let text = "Hello";
38 |
39 | let person = {name: "John"};
40 |
41 |
42 |
43 |
44 |
45 |
46 | let name = "Mehmet";
47 | let displayName = name;
48 | // let displayName = "Mehmet"
49 |
50 | name = "Ahmet";
51 |
52 | console.log(name);
53 | console.log(displayName);
54 |
55 | // araba => 10101010101
56 | let araba = {
57 | type: "Sport",
58 | name: "Porche"
59 | };
60 |
61 | // araba => 11001010101
62 | let baskabirAraba = {
63 | type: "Sport",
64 | name: "Porche"
65 | };
66 |
67 | let baskaAraba = araba;
68 |
69 | baskaAraba.name = "Mercedes";
70 |
71 | console.log(araba.name);
72 | console.log(baskaAraba.name);
73 |
74 |
75 | console.log(araba === baskaAraba);
76 |
77 | console.log(araba === baskabirAraba);
78 |
79 |
80 | let a = null;
81 | console.log(a);
82 | // null
83 |
84 | let b;
85 | console.log(b);
86 | // undefined
87 |
88 | let d = {};
89 | console.log(d.name);
90 | // undefined
91 |
92 | if(null){console.log("Hello")}
93 | if(undefined){console.log("hELLO")}
94 |
95 | console.log(null !== undefined);
96 | console.log(null == undefined);
97 |
98 |
99 |
100 | // value, expression, statement
101 | // value üreten şeyler: expression
102 | let a = 5;
103 | let b = 3 + 5;
104 | // statement: bir aksiyon gerçekleştiren
105 | if(3>5){
106 | console.log("işlem");
107 | }
108 |
109 | // operators
110 | let z = 5 + 6;
111 | let b = 3 * 5;
112 |
113 | // arithmetic operators
114 | //+, *, -, **, /, %, ++, --
115 |
116 | let toplam = 8;
117 | //toplam = toplam + 1;
118 | // toplam ++
119 |
120 | let toplam = 8;
121 | //let a = toplam++; // a = 8, toplam = 9
122 | let b = ++toplam; // b= 9, toplam=9
123 |
124 |
125 | // assignment operators
126 | let a = 3;
127 | // +=
128 | let x = 5;
129 | x += 3;
130 | x -= 3;
131 | // x = x - 3
132 | // x = 5 + 3;
133 |
134 | let text = "Hello" + " " + "World"
135 |
136 | // comparison operators
137 | // == equals to
138 | // === equal value and equal type
139 | // != not equal to
140 | // !== not equal value and not equal type
141 | // > greater than < less than >= <=
142 | // ? ternary
143 |
144 | 3 === "3"
145 |
146 | let age = 100;
147 | let isOld = age > 90 ? "Yes" : "No";
148 | console.log(isOld);
149 |
150 | // logical operators
151 | // && logical and
152 | // || logical or
153 | // ! logical not
154 |
155 | console.log((3 > 2) && (5>4))
156 | console.log((1 > 5) || (3 > 6) || (10 > 8))
157 |
158 | const ornek = 3 && 5 && 1 && 0 && 2;
159 | console.log(ornek);
160 |
161 | const ornek2 = 0 || false || undefined || 0 || null;
162 | console.log(ornek2);
163 |
164 | const firstName = person && person.name && person.name.firstName;
165 | // optional chaining
166 | const firstName = person?.name?.firstName
167 |
168 | let isOpen = true;
169 | function toggleDrodown(){
170 | isOpen = !isOpen
171 | }
172 |
173 | if(!!name){
174 |
175 | }
176 |
--------------------------------------------------------------------------------
/Week1/code/part2.js:
--------------------------------------------------------------------------------
1 |
2 | function multiply(a,b){
3 | console.log(a*b)
4 | }
5 |
6 | // If else statements
7 | if(3>5){
8 | console.log("3, 5ten büyüktür");
9 | }else{
10 | console.log("3, 5ten küçüktür");
11 | }
12 |
13 | function logTruthiness(val){
14 | if(val){
15 | console.log("Truthy!");
16 | }else{
17 | console.log("Falsy!");
18 | }
19 | }
20 |
21 | logTruthiness(true);
22 | // Truthy
23 |
24 | logTruthiness({});
25 | // Truthy
26 |
27 | logTruthiness([]);
28 | // Truthy
29 |
30 | logTruthiness("some string");
31 | // Truthy
32 |
33 | logTruthiness(3.14);
34 | // Truthy
35 |
36 | logTruthiness(new Date());
37 | // Truthy
38 |
39 | logTruthiness(false);
40 | logTruthiness(null);
41 | logTruthiness(undefined);
42 | logTruthiness(NaN);
43 | logTruthiness(0);
44 | logTruthiness("");
45 | // Falsy
46 |
47 |
48 | const getFee = function(){
49 | return isMember ? "$2.00" : "$10.00";
50 | }
51 |
52 | if(a == 5){
53 | console.log("a 5tir")
54 | }else if(a === 3){
55 | console.log("a 3 tür")
56 | }else{
57 | console.log("a 3 ya da 5 değildir");
58 | }
59 |
60 | // Switch case
61 | let price = 1;
62 |
63 | switch (price){
64 | case 1:
65 | alert("So cheap");
66 | break;
67 | case 2:
68 | alert("Affordable");
69 | break;
70 | case 3:
71 | alert("too expensive");
72 | break;
73 | default:
74 | alert("Unkown price");
75 | }
76 |
77 | /*
78 | // Loops
79 | // while loop
80 | let sayi1 = 10
81 | while(sayi1<10){
82 | console.log(sayi1);
83 | sayi1++;
84 | }
85 |
86 | // do..while loop
87 | let sayi2 = 10;
88 | do{
89 | console.log(sayi2);
90 | sayi2++;
91 | } while(sayi2 < 10)
92 |
93 | */
94 |
95 | for(let i=0; i<10; i++){
96 | if(i ===2){
97 | continue;
98 | }
99 | console.log(i);
100 | }
101 | let i=10
102 | for(; i< 10 ; i++){
103 | break;
104 | }
105 |
106 | // Functions
107 | // Function Declarations ve Function Expressions
108 |
109 | /*
110 | multiply(3,5);
111 | addition(3,5);
112 |
113 | function multiply(a,b){
114 | console.log(a*b)
115 | }
116 |
117 | const addition = function (a,b){
118 | console.log(a + b);
119 | }
120 |
121 | multiply(3,5);
122 | addition(3,5);
123 | */
124 |
125 | /*
126 | console.log(degisken);
127 | let degisken = 5;
128 | console.log(degisken);
129 | */
130 |
131 | arr.forEach(function(item, index){
132 |
133 | });
134 |
135 | /*
136 | (function multiply(a,b){
137 | console.log(a*b)
138 | })(3,5);
139 |
140 | */
141 |
142 | /// RegEx
143 | /*
144 | const regexp = new RegExp("pattern", "flags");
145 | const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
146 |
147 | re.test("a@b.com");
148 | */
149 |
--------------------------------------------------------------------------------
/Week1/docs/introduction_js.md:
--------------------------------------------------------------------------------
1 | ## JavaScript'e giriş
2 | Javascript en başta "web sitelerini interaktif hale getirmek" için oluşturulmuştur.
3 | JavaScript'de yazılan programlar "script" olarak adlandırılır ve web sayfasının HTML'i içersinde yer alır.
4 |
5 | > En başta JavaScript'in ismi "LiveScript" di. Ancak o zamanlar Java çok popülerdi ve Java'nın kardeşi olarak bu dile JavaScript ismini vermek bu popülariteden faydalanmak için güzel bir fırsattı. Daha sonra JavaScript hızla gelişerek ECMAScript adını aldı ve şu an Java ile hiçbir bağlantısı bulunmuyor.
6 |
7 | Günümüzde JavaScript sadece tarayıcıda değil sunucu tarafında da çalışabilmektedir, daha doğrusu JavaScript engine içeren herhangi bir cihazda çalışabilir.
8 |
9 | V8 – Chrome ve Opera.
10 |
11 | SpiderMonkey – Firefox.
12 |
13 | IE için “Chakra", Microsoft Edge için “ChakraCore”...
14 |
15 | ### JavaScript ile tarayıcıda neler yapılabilir?
16 |
17 | - Sayfaya yeni HTML eklemek, var olanı değiştirmek, stillendirmek.
18 | - Kullanıcı aksiyonlarıyla çalışmak (Mouse tıklamaları, klavye tuşlarına basılması, mouse imlecinin hareketi)
19 | - Uzak sunuculara istekler yollamak, dosya yüklemek ve indirmek,
20 | - Cookiler yazmak ce okumak, kullanıcıya mesajlar göstermek,
21 | - Client-side data tutmak (LocalStorage)
22 |
23 | ### Hello, World!
24 | Şimdi JavaScript'i çalıştırmak için bir ortama ihtiyacımız var. Tarayıcının iyi bir seçim olabileceğini bu aşamada biliyoruz.
25 |
26 | #### Script tag'i
27 | JavaScript kodları HTML'de hemen her yere script tagları içersinde yerleştirilebilir.
28 |
29 | ```html
30 |
31 |
32 |
33 |
Script öncesi...
34 |
35 |
38 |
39 |
Script sonrası
40 |
41 |
42 | ```
43 |
44 | >type attribute'u:
50 |
51 | ```
52 |
53 | ### Daha fazlası
54 | - JavaScript en başta sadece tarayıcıda çalışacak şekilde tasarlandı, ancak şu an başka ortamlarda da kullanılabilmekte
55 | - JavaScript, tarayıcıda HTML, CSS ile entegre çalışarak şu anda alternatifsiz pozisyonda
56 | - Şu anda JavaScripte transpile olabilen(çevrilebilen) bir çok dil de bulunmakta. (Typescript, CoffeScript, Flow...)
57 |
58 | ### Tasks
59 | - Kullanıcıya "Hello, World" mesajı çıkartan bir alert gösteriniz.
60 | - Yukarıdaki taski external script kullanarak yapınız.
61 |
--------------------------------------------------------------------------------
/Week1/readme.md:
--------------------------------------------------------------------------------
1 | ##Gelecek hafta hazırlık
2 |
3 | ```js
4 | for(var i = 1; i<=10; i = i + 2){ console.log("Guncel deger", i); }
5 | for(let i = 1; i<=10; i = i + 2){ console.log("Guncel deger", i); }
6 | ```
7 |
--------------------------------------------------------------------------------
/week2/code/coercion.md:
--------------------------------------------------------------------------------
1 | // true + false
2 | // 1 + 0
3 | // 1
4 |
5 |
6 | // 12 / "6"
7 | // 12 / 6
8 | // 2
9 |
10 |
11 | // "number" + 15 + 3
12 | // "number" + 15
13 | // "number15"
14 | // "number15" + 3
15 | // "number153"
16 |
17 | // 15 + 3 + "number"
18 | // 15 + 3
19 | // 18
20 | // 18 + "number"
21 | // "18number"
22 |
23 |
24 | // [1] > null
25 | // "1" > null
26 | // 1 > 0
27 | // true
28 |
29 | // [] + []
30 | // "" + ""
31 | // ""
32 |
33 | // "foo" + + "bar"
34 | // "foo" + NaN
35 | // "fooNaN"
36 |
37 | // "true" == true
38 | // NaN == 1
39 | // false
40 |
41 |
42 | // ["x"] == "x"
43 | // "x" == "x"
44 | // true
45 |
46 |
47 | // [] + null + 1
48 | // [] + null
49 | // "" + null
50 | // "null"
51 | // "null" + 1
52 | // "null1"
53 |
54 |
55 | // 0 || "0" && {}
56 | // "0" && {}
57 | // {}
58 |
59 |
60 | //[1,2,3] == [1,2,3]
61 | // false
62 | console.log({}+[]+{}+[1])
63 | // {}+[]+{}+[1]
64 | // +[]+{}+[1]
65 | // 0 + {} + [1]
66 | // 0 + "[object Object]" + [1]
67 | // "0[object Object]" + [1]
68 | // "0[object Object]" + "1"
69 | // "0[object Object]1"
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/week2/code/this.js:
--------------------------------------------------------------------------------
1 | /// THIS
2 |
3 | // 1. Implicit
4 |
5 | const user = {
6 | name: "Joe",
7 | age: 30,
8 | greet(){
9 | console.log("Hello, my name is " + this.name);
10 | }
11 | }
12 |
13 | user.greet();
14 |
15 | const user = {
16 | name: "Joe",
17 | age: 30,
18 | greet(){
19 | /// this = user
20 | console.log("Hello, my name is " + this.name);
21 | },
22 | mother: {
23 | name: "Stacey",
24 | greet(){
25 | /// this = mother
26 | console.log("Hello, my name is " + this.name);
27 | }
28 | }
29 | }
30 |
31 | user.mother.greet();
32 |
33 |
34 | // 2. Explicit
35 | // call, apply, bind
36 |
37 | function greet(language1, language2){
38 | console.log("Hello, my name is " + this.name + " and I know " + language1 + ", " + language2)
39 | }
40 |
41 | function greet2(languages){
42 | const userLanguages = languages.join(", ");
43 | console.log("Hello, my name is " + this.name + " and I know " + userLanguages)
44 | }
45 |
46 | const user = {
47 | name: "Mary",
48 | age: 26
49 | }
50 |
51 | greet.call(user, "JavaScript", "Python");
52 |
53 | let languages= ["JavaScript", "Python"];
54 | greet.apply(user, languages);
55 |
56 | let myFunc = greet.bind(user, "JavaScript", "Python");
57 |
58 | let myFunc2 = greet2.bind(user, languages)
59 |
60 | myFunc();
61 |
62 |
63 | // 3. new Binding
64 |
65 | function User(name, age){
66 | this.name = name;
67 | this.age = age;
68 | }
69 |
70 |
71 | const Joe = new User("Joe", 27);
72 |
73 | Joe.name
74 | Joe.age
75 |
76 |
77 | // 4. lexical binding
78 |
79 | const user = {
80 | name: "Joe",
81 | age: 27,
82 | languages: ["JavaScript", "Python", "Rust"],
83 | greet(){
84 | const hello = "Hello, my name is" + this.name + " and I know";
85 |
86 | const langs = this.languages.reduce((str, lang, i) => {
87 | if(i === this.languages.length - 1){
88 | return str + " and " + lang
89 | }
90 |
91 | return str + "," + lang;
92 | }, "")
93 |
94 | console.log(hello + langs);
95 | }
96 | }
97 |
98 | user.greet();
99 |
100 |
101 | // 5. window binding
102 | window.age = 27;
103 |
104 | function sayAge(){
105 | // this = window.
106 | console.log("My age is" + this.age);
107 | }
108 |
109 | sayAge();
110 | /// window.sayAge();
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
--------------------------------------------------------------------------------
/week2/code/thisreduce.js:
--------------------------------------------------------------------------------
1 | const arr = [1,2,3,4,5,6];
2 |
3 | arr.reduce(function(accumulator, currentValue){
4 | // 1. accumulator = 0, currentValue = 1, accumulator = 1
5 | // 2. accumulator = 1, currentValie = 2, accumulator = 3;
6 | // 3. accumuaator = 3, currentValue = 3, accumulator = 6
7 | ///.....
8 | return accumulator + currentValue;
9 | }, 0)
10 |
11 |
12 | arr.reduce(function(acc, crr){
13 | return acc*crr
14 | }, 1)
15 |
16 |
17 | const user = {
18 | name: "John",
19 | sayMyName(){
20 | setTimeout(()=>{
21 | console.log("Says " + this.name + " after 1 second");
22 | }, 1000);
23 | }
24 | }
25 |
26 | user.sayMyName();
27 |
28 |
29 |
--------------------------------------------------------------------------------
/week2/docs/1.Scope.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/week2/docs/2.ExecutionContext.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/week2/docs/coercion.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/week2/docs/readme.md:
--------------------------------------------------------------------------------
1 | 1. Coercion
2 | - Explicit Coercion
3 | - Implicit Coercion
4 |
5 | 2. Scope (Mehmet ve Umutcan)
6 | - Global Scope
7 | - Function Scope
8 | - Block Scope
9 | - Hoisting
10 | - Let vs Var
11 |
12 | 3. Closures (Nisan)
13 |
14 | 4. IIFE (Gürhan)
15 |
16 | 5. Execution context, call stack (Selen)
17 |
18 | 6. This keyword
19 |
20 | 7. Objects (Gizem)
21 | - https://javascript.info/object#square-brackets
22 |
23 | 8. Prototypes (Mahmut)
24 |
25 | 9. bind, apply, call (Tolunay)
26 |
27 | 10. ES6 Class keyword (Bahar)
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/week2/drafts/Closure.md:
--------------------------------------------------------------------------------
1 | # Closure
2 |
3 | Namı değer Closure, diğer adıyla backpack'ten size bu yazıda bahsetmeye çalışacağım. Öncelikle aralarda bahsi geçen bazı kavramları biliyor olduğunuzu varsayarak bu yazıyı yazdığımı belirtmek isterim. Örneğin: **Global Memory**, **Heap**, **Call Stack**, **Execution Context**... Evet artık hazırsanız başlayabiliriz.
4 |
5 | Ben bu konudan bahsederken backpack terimini kullanmayı daha yararlı görüyorum. Bu yüzden metafor olarak bunu kullanarak devam edeceğim bu yazıda.
6 |
7 | Peki nedir bu Backpack?
8 |
9 | Bildiğiniz gibi herhangi bir fonksiyon execute edildiği anda (çağırıldığında) kendi Execution Context'ini ve beraberinde Local Memory'sini yaratır. Bunu bir mini program gibi düşünebiliriz. En dışta her zaman Call Stack'in en altında bulunan ve her şeyden önce oluşturulan Global Execution Context gelir. Burada globalde tanımlı variable ve function'larımız bulunur. Bu context içerisinde çağrılan her fonksiyon çağrılma sırasına göre Call Stack'e push edilir. Ve en son çağırılan function önce işleme alınır (LIFO - Last In First Out). İşleme alınan function işi bittiğinde yani return olduğu anda Call Stack'ten pop edilir ve Garbage Collector tarafından memory'den silinir. Bu da demek oluyor ki, bizim mini program gibi çalışan functionlarımız'ın içerisinde bulunan ve local memory'i de tutulan (local state) datalarımız da silinmiş olur. Kod üzerinde inceleyerek devam edelim;
10 |
11 | ```javascript
12 | function createFunction() {
13 | function multiplyBy2(num) {
14 | return num * 2;
15 | }
16 | return multiplyBy2;
17 | }
18 | const generatedFunc = createFunction();
19 | const result = generatedFunc(3); // 6
20 | ```
21 | Bildiğiniz üzere JavaScript'te bir fonksiyon başka fonksiyonu return edebilir. Bu örnekte **createFunction** fonksiyonu çağırılıyor ve **multiplyBy2** fonksiyonunu Global Memory'de bulunan **generatedFunc** değişkenine atıyor. Burada kilit nokta; **generatedFunc** ile **createFunction** arasında herhangi bir bağlantı olmayışıdır. **generatedFunc** sadece **createFunction**'ın tek çağırımlık bir sonucudur. JavaScript'in sekron çalışmasından dolayı generatedFunc bir kez çağırılıp herhangi bir değer return ettikten sonra (Bu örnekte 6 değeri return ediliyor) memory'den local memory'sinde bulunan **num** (Bu örnekte num = 3) değeriyle birlikte silinecek. Tekrar çağırıldığında da sıfırdan oluşturulacak ve local memory'si de haliyle yeniden oluşturulmuş olacak.
22 |
23 | Peki ben fonksiyonumun çağırılmasından sonra önceki çağırımını hatırlamasını istiyorsam ne olacak?
24 |
25 | Yani function'ım return olsun ama içerisinde kendisine ait olan datalar kaybolmasın. Tekrar bu function'ı çağırdığımda önceki çağırımını hatırlasın istiyorum. Bir nevi function'a kalıcı bir hafıza (cache/persistent memory) kazandırmak istiyorum diyebiliriz. Burada aslında Backpack'in daha uzun adını da sizinle paylaşmak ve isim üzerinden ilerlemek isterim.
26 |
27 | ### Persistent Lexical Scope Reference Data (P.L.S.R.D)
28 |
29 | Aslında bu uzun ama bir o kadar da Closure'u açıklayan bir tanımlama. Örnek kod üzerinden ilerleyerek devam edelim.
30 | ```javascript
31 | function outer() {
32 | let counter = 0;
33 | function incrementCounter() {
34 | counter++;
35 | }
36 | return incrementCounter;
37 | }
38 | const myFunction = outer();
39 | myFunction() // 1
40 | myFunction() // 2
41 | ```
42 | Kodu satır satır inceleyecek olursak; Global Memory'de bir **outer** fonksiyonum ve henüz undefined durumunda olan **myFunction** adında bir değişkenim var. **outer** fonksiyonu çağrılıyor bu da demek oluyor ki kendi Execution Context'i oluşacak. Aynı zamanda fonksiyon Call Stack'e de eklenecek. Bu şekilde Call Stack yardımıyla JS Engine bizim işlemlerimizin sırasını da takip etmiş oluyor.
43 |
44 | Kodda gördüğümüz üzere **outer** fonksiyonu, **incrementCounter** adında bir fonksiyonu kendi scope'unda tanımlayıp sonrasında return ediyor. Daha sonra bu return olan **outer** fonksiyonu Call Stack'ten çıkarılıyor ve Garbage Collector tarafından temizleniyor. Yani artık daha sonra dönüp bakabileceğim outer'a ait bir Execution Context'im yok. Devamında dönen **incrementCounter** fonksiyonunu **myFuncion** adında başka bir değişkene atıyoruz. Burada **myFunction'ının** ilk çağırımında **1**, ikinci çağırımında **2** değerini elde ediyoruz. Bu da demek oluyorki **myFunction** önceki değerini hatırlayan kalıcı bir hafızaya (state'te) sahip. İşte bu nokta da tanıma tekrar dönebiliriz.
45 |
46 | **incrementCounter** fonksiyonu return olurken beraberinde Lexical Scope'unda ne varsa hepsini **Backpack**'ine atıyor. Lexical Scope'unda **counter = 0** değeri mevcut. Bunu **[[scope]]** adında bir hidden property'nin içerisine alarak **reference**'ını heap'e taşımış oluyor. Artık benim globalde erişebileceğim **incrementCounter**'e ait kalıcı bir değerim mevcut. Ve ben bu fonksiyonu ne zaman çağırırsam önce kendi scope'una bakacak ve orada counter'ı bulamayıp bir üst scope olan Global Scope'una gidecek. Backpack'ine bakacak ve oradan counter'a erişip gerekli işlemleri gerçekleştirebilecek.
47 |
48 | Closure'u kullandığımız bir çok alan var. Bunlardan bazıları:
49 |
50 | - Iterator ve Generator'lar
51 | - Module Pattern
52 | - Asynchronous JavaScript (Callback ve Promise'ler)
53 | - Functional Programming (Curriying)
54 |
55 | Bu konu anlat anlat bitmez. O yüzden bir yerde noktalamam gerekiyor 🙂 Bu sebeple daha fazla devam etmiyorum. Fakat bu yazıyı okurken "bu ne ya ilk kez duydum" dediğiniz şeyler varsa ve bunları araştırmanıza vesile olduysam ne mutlu bana. İyi kodlamalar 😇
56 |
--------------------------------------------------------------------------------
/week2/drafts/Objects.md:
--------------------------------------------------------------------------------
1 | # Objects
2 |
3 | JavaScriptte 8 tane veri tipi vardır. Bunların yedi tanesi primitive olarak adlandırılır(string, boolean, number, bigInt, null, undefined,symbol).
4 | Diğer veri tipi de objectdir.
5 |
6 | Objectler ise veriyi key ve value olarak tutmamızı sağlar.
7 |
8 | Objeler {...} arasında tanımlanır.
9 |
10 | ```javascript
11 | let propertyName: {
12 | key: value
13 | }
14 | ```
15 |
16 | Objeler key değerlerine göre saklanır.
17 |
18 | Boş bir object yaratmak için :
19 |
20 | ```javascript
21 | let user = new Object(); // "object constructor" syntax
22 | let user = {}; // "object literal" syntax
23 | ```
24 | # Özellikleri
25 |
26 | ```javascript
27 | let user = { // an object
28 | name: "John", // by key "name" store value "John"
29 | age: 30 // by key "age" store value 30
30 | };
31 | ```
32 |
33 | Burada tanımlanan user property name olarak geçer. Object içerisindeki name ise key olarak adlandırılır aynı zamanda da (name ya da identifier olarak da bilinir)
34 |
35 | İkinci name age ise 30 valuesuna sahiptir aynı zaman da name inde value değeri John'dur.
36 |
37 |
38 | Objelerde istediğimiz zaman ekleme, silme ve okuma işlemleri yapabiliriz.
39 |
40 | // get property values of the object:
41 |
42 | ```javascript
43 | alert( user.name ); // John
44 | alert( user.age ); // 30
45 | ```
46 |
47 | ```javascript
48 | user.isAdmin = true; // Bu şekilde objeye değer ekleme yapabiliriz.
49 | delete user.age; // Objeden eleman silme işlemini de bu şekilde gerçekleştirebiliriz.
50 | ```
51 | **Obje tanımlamaları yaparken boşluk içeremez, özel karakterlerle( $ ve _ gibi) ve rakamlarla başlayamaz.**
52 |
53 | // this would give a syntax error
54 |
55 | ```javascript
56 | user.likes birds = true
57 | ```
58 | // bu gösterimde arada boşluk içerdiği için çalışmayacaktır.
59 |
60 | Alternatif olarak **square bracket notation** gösterimiyle string olarak nesneye eleman ekleyebiliriz.
61 |
62 | ```javascript
63 | let user = {};
64 | // set
65 | user["likes birds"] = true;
66 | // get
67 | alert(user["likes birds"]); // true
68 | // delete
69 | delete user["likes birds"];
70 | user: {
71 | "likes birds": true // Burada user objesini quare bracket notation gösterimiyle set ettiğimizde alacağımız sonuç bu şekilde olacaktır.
72 | }
73 | ```
74 |
75 | user["likes birds"] = true; // Bu gösterimde ise köşeli paranter içerisinde key değerini verdiğimizde o objeye erişip value değerini okuyabilir ya da değiştirebilir.
76 |
77 | # Object propertylerine erişim
78 |
79 | ```javascript
80 | let user: {
81 | name: "John",
82 | age: 30
83 | }
84 | // 1
85 | user.name;
86 | // 2
87 | user["name"];
88 | ```
89 |
90 | **user["likes birds"] = true; **
91 | // Yukarıda tanımladığımız objeye de köşeli paranter içerisinde key değerini verdiğimizde o objeye erişip value değerini okuyabilir ya da değiştirebiliriz.
92 |
93 | **Genellikle objeleri real kod ortamında bu şekilde kullanırız.**
94 |
95 | ```javascript
96 | function makeUser(name, age) {
97 | return {
98 | name: name,
99 | age: age,
100 | // ...other properties
101 | };
102 | }
103 | ```
104 |
105 | let user = makeUser("John", 30);
106 | alert(user.name); // John
107 |
108 | ```
109 | Yukarıdaki fonksiyonun parametleriyle objenin propertyleri aynı değer böyle olduğunda **shorthand** kullanabiliriz.
110 | ```Javascript
111 | function makeUser(name, age) {
112 | return {
113 | name, // same as name: name
114 | age, // same as age: age
115 | // ...
116 | };
117 | }
118 | ```
119 |
120 | # Property adlandırılması
121 |
122 | Değişkenlerde for, let, return gibi isim değerleri kullanamayız fakat objelerde tanımlayabiliriz.
123 |
124 |
125 | ```Javascript
126 | // these properties are all right
127 | let obj = {
128 | for: 1,
129 | let: 2,
130 | return: 3
131 | };
132 | alert( obj.for + obj.let + obj.return ); // 6
133 | ```
134 |
135 | # Nested JS Objects
136 |
137 | ```Javascript
138 | let person = {
139 | firstName: "James",
140 | lastName: "Bond",
141 | age: 25,
142 | address: {
143 | id: 1,
144 | country:"UK"
145 | }
146 | };
147 | person.address.country; // returns "UK"
148 | ```
149 |
150 | # Method shorthand
151 |
152 | ```Javascript
153 | let person = {
154 | firstName: 'John',
155 | lastName: 'Doe',
156 | greet: function () {
157 | console.log('Hello, World!');
158 | },
159 | getFullName: function () {
160 | return this.firstName + ' ' + this.lastName;
161 | }
162 | };
163 | console.log(person.getFullName()); // 'John Doe'
164 | ```
165 |
166 | # The “for…in” loop
167 |
168 | ```Javascript
169 | let user = {
170 | name: "John",
171 | age: 30,
172 | isAdmin: true
173 | };
174 | for (let key in user) {
175 | // keys
176 | alert( key ); // name, age, isAdmin
177 | // values for the keys
178 | alert( user[key] ); // John, 30, true
179 | }
180 | ```
181 |
182 | # Sorular
183 |
184 | 1-)
185 | ```Javascript
186 | let school = {
187 | name: 'Vivekananda School',
188 | displayInfo : function(){
189 | console.log(`${school.name.split(' ')[0]}`);
190 | }
191 | }
192 | school.displayInfo(); // Çıktısı ne olur ?
193 | ```
194 |
195 | 2-)
196 | ```Javascript
197 | const object1 = new Object();
198 | object1.property1 = 42;
199 |
200 | console.log(object1.hasOwnProperty('property1')); // Çıktısı ne olur ?
201 | ```
202 |
203 | 3-)
204 | ```Javascript
205 |
206 | let a = {
207 | x: "y"
208 | }
209 | console.log("x" in a); // Çıktısı ne olur ?
210 | ```
211 |
--------------------------------------------------------------------------------
/week2/drafts/Prototypes.md:
--------------------------------------------------------------------------------
1 | Prototypal Inheritance
2 |
3 | String array ya da objelerle birlikte .length .join() .split() gibi built-in metodları nasıl kullanabildiğimizi hiç düşündünüz mü? Bunların hepsi aslında prototypal inheritance denen bir kavramdan geliyor.
4 |
5 | Genellikle birden fazla obje yaratmamız gereken ya da birşeyleri alıp özelliklerini extend etmeyi ve kullanmayı istediğimiz durumlarla karşılarız. JavaScript'te, bu gibi durumlar için objelerin özel bir gizli özelliği [[Prototype]] (burada adlandırıldığı gibi) vardır; bu, null veya başka bir objeye referans edebilir. Bu objeye "prototip" denir.
6 |
7 | Objeden bir propertyi okuduğumuzda ve eksik olduğunda, JavaScript onu prototipten otomatik olarak alır. Programlamada böyle bir şeye "prototypal inheritance" denir. Bununla ilgili bazı örnekleri ve bunun üzerine inşa edilen bazı dil özelliklerini inceleyeceğiz.
8 |
9 | let animal = {
10 | eats: true
11 | };
12 | let rabbit = {
13 | jumps: true
14 | };
15 |
16 | rabbit.__proto__ = animal; // sets rabbit.[[Prototype]] = animal
17 |
18 | Şimdi rabbitten bir propertyi okursak ve bu eksikse, JavaScript onu animaldan otomatik olarak alır.
19 |
20 | Örneğin:
21 |
22 | let animal = {
23 | eats: true
24 | };
25 | let rabbit = {
26 | jumps: true
27 | };
28 |
29 | rabbit.__proto__ = animal; // (*)
30 |
31 | // Artık her ikisini de rabbit'te bulabilirsiniz.
32 | alert( rabbit.eats ); // true (**)
33 | alert( rabbit.jumps ); // true
34 |
35 |
36 | Burada (*) satırı, animalı bir rabbit prototipi olarak ayarlar.
37 |
38 | Daha sonra, alert rabbit.eats (**) propertysini okumaya çalıştığında, bu rabbitte değildir, bu nedenle JavaScript [[Prototype]] referansını takip eder ve animalda bulur (aşağıdan yukarıya bakın):
39 |
40 | Burada 'animal rabbitin prototipidir' veya 'rabbit prototip olarak animaldan miras kalır' diyebiliriz.
41 |
42 | Dolayısıyla, hayvanın birçok yararlı özelliği ve metodu varsa, otomatik olarak tavşanda kullanılabilir hale gelirler. Bu tür özelliklere "inheritance" denir.
43 |
44 | Hayvanda bir metodumuz varsa, rabbitte de çağrılabilir:
45 |
46 | let animal = {
47 | eats: true,
48 | walk() {
49 | alert("Animal walk");
50 | }
51 | };
52 |
53 | let rabbit = {
54 | jumps: true,
55 | __proto__: animal
56 | };
57 |
58 | // walk prototipten alınmıştır.
59 | rabbit.walk(); // Animal walk
60 |
61 | Method prototipten otomatik olarak şu şekilde alınır:
62 | animal:
63 | eats: true
64 | walk: function -------> rabbit: jumps: true
65 |
66 | Prototip zinciri daha da uzun olabilir:
67 |
68 | let animal = {
69 | eats: true,
70 | walk() {
71 | alert("Animal walk");
72 | }
73 | };
74 |
75 | let rabbit = {
76 | jumps: true,
77 | __proto__: animal
78 | };
79 |
80 | let longEar = {
81 | earLength: 10,
82 | __proto__: rabbit
83 | };
84 |
85 | // walk prorotip zincirinden alınmıştır.
86 | longEar.walk(); // Animal walk
87 | alert(longEar.jumps); // true (from rabbit)
88 |
89 | Şimdi longEar'dan bir şey okursak ve bu eksikse, JavaScript onu rabbitte ve sonra animalda arayacaktır.
90 |
91 | __Proto__’un değeri bir obje veya null olabilir. Diğer türler göz ardı edilir.
92 |
93 | Çok açık olsa da tekrar söylemekte yarar var. Bir obje sadece bir tane [[Prototype]]'a sahip olabilir. Bir objenin iki farklı objeden kalıtım alamaz.
94 |
95 | Not: Lütfen __proto__ 'nun [[Prototype]] özelliği ile aynı olmadığını unutmayın. __proto__ bir nevi [[Prototype]] için bir getter / setter olarak kullanılır. Daha sonra önemli olan kısımları tekrar göreceğiz, şimdilik sadece aynı şey olmadığını aklımızda tutalım.
96 |
97 | Prototip sadece özelliklerin okunması için kullanılır. Veri özelliklerinin yazılma/silinme ( getter/setter değil) işi doğrudan obje üzerinden yapılır.
98 |
99 | Aşağıdaki örnekte rabbit'e kendi walk metodu atanmıştır:
100 | let animal = {
101 | eats: true,
102 | walk() {
103 | /* Bu metod rabbit tarafından kullanılmayacaktır. */
104 | }
105 | };
106 |
107 | let rabbit = {
108 | __proto__: animal
109 | }
110 |
111 | rabbit.walk = function() {
112 | alert("Rabbit! Bounce-bounce!");
113 | };
114 |
115 | rabbit.walk(); // Rabbit! Bounce-bounce!
116 |
117 | Artık rabbit.wal() metodu doğrudan kendi içerisinde bulur ve çalıştırır. Prototip kullanmaz.
118 | Kısaca prototiplere ve prototip zincirlerine bu şekilde değinebiliriz. Bir sonraki konuda görüşmek üzere!
119 |
120 | //Kaynaklar:
121 | //https://javascript.info/
122 |
--------------------------------------------------------------------------------
/week2/drafts/Scope(Global-Function-Block).md:
--------------------------------------------------------------------------------
1 | # Scope(Kapsam)
2 |
3 | Scope, kodunuzun içinde bulunan **değişkenlerin**, **fonksiyonların** ve **objelerin**, görünürlük ve erişebilirliğini ifade eder.
4 |
5 | ### Global Scope
6 |
7 | Bir JavaScript dosyası içerisinde sadece bir **Global Scope** vardır. Bir değişken herhangi bir fonksiyon içerisinde tanımlanmamış ise Global scope içindedir. Global scope içerisinde bulunan değişkenlere, diğer scope'lar içinden erişilebilir/değiştirilebilir.
8 | ```javascript
9 | var fruit = "Elma";
10 | console.log(fruit); //elma
11 |
12 | function getFruit(){
13 | console.log(fruit); //fruit burada erişebilirdir.
14 | }
15 |
16 | getFruit(); //elma
17 | ```
18 |
19 | ### Function Scope
20 |
21 | Bir fonksiyon içerisinde tanımlanan değişken, sadece o fonksiyon içinde erişilebilirdir. Fonksiyon dışında bu değişkene erişilemez. **var**, Function scope için değişkeni tanımlayan anahtar sözcüktür.
22 | ```javascript
23 | function foo(){
24 | var fruit = "Elma";
25 | console.log(fruit);
26 | }
27 |
28 | foo(); //elma
29 | console.log(fruit) //Can't find variable: fruit
30 | ```
31 |
32 | ### Block Scope
33 |
34 | Block Scope, **koşul ifadeleri (if, switch)** ve **döngüler (for, while)** içindeki alandır. Genel olarak, **{süslü parantez}** görülen her yer bir bloktur. ES6'da hayatımıza giren **const** ve **let** anahtar sözcükleri, geliştiricilerin değişkenleri bir blok içerisinde tanımlamasına izin verir. Bu da bu değişkenlerin yalnızca karşılık gelen blok içinde erişilebilir olduğu anlamına gelir.
35 | ```javascript
36 | function foo(){
37 | if(true){
38 | var fruit1 = "elma";
39 | const fruit2 = "muz";
40 | let fruit3 = "çilek";
41 | }
42 | console.log(fruit1);
43 | console.log(fruit2);
44 | console.log(fruit3);
45 | }
46 |
47 | foo();
48 | //elma
49 | //Can't find variable: fruit2
50 | //Can't find variable: fruit3
51 | ```
52 |
53 |
--------------------------------------------------------------------------------
/week2/drafts/call-apply-bind.md:
--------------------------------------------------------------------------------
1 |
2 | **Call ve Apply**
3 |
4 | Call ve Apply fonksiyonları Function objemizin __proto__ objesinde bulunan iki adet fonksiyondur. Bu fonksiyonların görevleri aynı olsa da kullanımları arasında ufak bir fark vardır. Şimdi ilk olarak Mozilla’nın dokümanlarından bu fonksiyonların ne iş yaptığını anlamaya çalışalım.
5 |
6 | > **Call() fonksiyonu, verilen this anahtar değeriyle(obje) ve bağımsız olarak sağlanan bağımsız argümanlarla bir fonksiyonu çağırır. Argümanlar fonksiyona tek tek gönderilir. (Örnek: test(obj,arg1,arg2,arg3))**
7 | >
8 | > **Apply() fonksiyonu, verilen this anahtar değeriyle(obje) ve bağımsız olarak sağlanan değişkenlerle bir fonksiyonu çağırır. Argümanlar fonksiyona argüman listesi şeklinde gönderilir. (Örnek: test(obj,[arg1,arg2,arg3]))**
9 |
10 | Yani anlaşılacağı üzere ikisinin görev tanımı aynı tek farkı Call fonksiyonu için kaç parametre varsa onların hepsini tek tek yazmamız gerekiyor. Apply için ise parametreye bir dizi verilebilir.
11 | Bu fonksiyonların ne yaptığını anlamak için şu örneğimize bakalım.
12 |
13 | const obj1 = {
14 | number1: 10,
15 | number2: 20,
16 | }
17 | const obj2 = {
18 | number1: 30,
19 | number2: 50,
20 | }
21 | function addNumbers(num){
22 | console.log(this.number1 + this.number2 + num );
23 | }
24 | addNumbers(100); // NaN
25 |
26 | Buradaki çıktının neden **_NaN olduğuyla_** ilgili bir fikri olan var mı ? Fikri olmayanlar için açıklamak gerekirse, şu anda global scope’ta bulunan objemiz window objesi olduğu için ve this anahtar kelimesi bu objeyi gösterdiği için bu sonucu aldık. Window objesinin içinde number1 veya number2 şeklinde property bulunmuyor. Bu nedenle aslında “undefined + undefined + 100” gibi bir toplama yapıyoruz ve bunun sonucunda “NaN” sonucunu elde ediyoruz.
27 |
28 | Peki bu örnekte addNumbers fonksiyonunun hem obj1 hem de obj2 objesi için çalışmasını istersek ne yapabiliriz ? İşte burada yardımımıza **call ve apply fonksiyonları** koşuyor. Burada, yukarıdaki tanımlara göre call veya apply fonksiyonlarını kullanırsak this anahtar kelimesi, call fonksiyonuna hangi objeyi argüman olarak gönderirsek onu gösterecektir.
29 |
30 | const obj1 = {
31 | number1:10,
32 | number2:20
33 | }
34 | const obj2 = {
35 | number1:30,
36 | number2:50
37 | }
38 |
39 | function addNumbers(num) {
40 | console.log(this.number1 + this.number2 + num);
41 | }
42 |
43 | addNumbers.call(obj1,100); // 10+20+100 = 130
44 | addNumbers.call(obj2,100); // 30+50+100 = 180
45 |
46 | Burada call metoduna birinci argüman olarak **obj1'i** gönderdiğimizde this anahtar kelimesi bu objeyi gösterdiği için sonucumuz 130 çıktı. Aynı şekilde, **obj2'i** gönderdiğimizde de 180 sonucunu aldık. Yani, bir fonksiyonu call fonksiyonuyla farklı objeler ile kullanabildik.
47 |
48 | Başka bir örnekle devam edelim.
49 |
50 | var person = {
51 | fullName: function(city, country) {
52 | return`${this.firstName} ${this.lastName}, ${city} ${country}`
53 | },
54 | }
55 | var person1 = {
56 | firstName:"John",
57 | lastName: "Doe"
58 | }
59 | person.fullName.call(person1, "Oslo", "Norway"); // John Doe,Oslo,Norway
60 |
61 | Görüleceği üzere fonksiyonu call ile çağıracağımız zaman bütün parametreleri tek tek yazmamız gerekiyor. Az parametre olduğunda çok sorun yok gibi peki boyutu 100 olan bir veri bütünü olsa hepsini tek tek elle mi yazmalıyız? Bu konuda bize Apply yardımcı oluyor.
62 |
63 | var person = {
64 | fullName: function(age,city, country) {
65 | return`${this.firstName} ${this.lastName},${age}, ${city} ${country}`
66 | }
67 | }
68 | var person1 = {
69 | firstName:"John",
70 | lastName: "Doe"
71 | }
72 | var otherInformations = ["26","Oslo", "Norway"]
73 |
74 | person.fullName.apply(person1, otherInformations );//John Doe,26, Oslo,Norway
75 |
76 |
77 | **Bind Fonksiyonu**
78 |
79 | Bind fonksiyonu da mantık olarak call ve apply fonksiyonlarına oldukça fazla benzer. Ancak kullanım olarak bu fonksiyonlardan farklıdır.
80 | > **Bind() fonksiyonu, içine verilen objeye göre yeni bir fonksiyon kopyası yaratır. Oluşan bu kopya fonksiyonu daha sonradan argüman listesi ile beraber gönderilen objeye kullanabiliriz.**
81 |
82 | Anlamak için örneğimize bakalım.
83 |
84 | const obj1 = {
85 | number1:10,
86 | number2:20
87 | };
88 |
89 | function getNumbersTotal(number3,number4) {
90 | return this.number1 + this.number2 + number3 + number4;
91 | }
92 | /* obj1'i this parametresinin göstereceği şekilde
93 | bağlayarak yeni bir fonksiyon oluşturuyoruz.
94 | */
95 |
96 | const copyFunc = getNumbersTotal.bind(obj1);
97 |
98 | console.log(copyFunc(30,40)); //100
99 |
100 |
101 |
102 | Burada da bind fonksiyonunun kullanımını görüyoruz. Aslında mantık olarak call ve apply’a benzese de yapı olarak epey farklı. Call ve Apply fonksiyonları bir fonksiyonu hemen çalıştırırken, bind fonksiyonu bize yeni bir kopya üretmektedir. Oluşturulan bu kopyayı ise istediğimiz herhangi bir bağlamda(context) kullanabiliriz.
103 |
104 | Aklınızda şu şekilde bir sorunun döndüğünü tahmin ediyorum.
105 |
106 | > **“Bind, Call ve Apply mantık olarak aynıysa hangisini nerelerde kullanacağım ?”**
107 |
108 | Javascript’e yeni başlayanların bu soruyu sorması oldukça normal. Cevabını şu şekilde verebiliriz.
109 |
110 | > **Bind fonksiyonundan, fonksiyonumuzu başka bir bağlamda daha sonradan kullanabilmek adına yararlanabiliriz (örnek,Javascript Olayları — JS Events). Call ve Apply Fonksiyonlarını ise bir fonksiyonu hemen bir obje ile çağırmak için kullanabiliriz.**
111 |
112 |
--------------------------------------------------------------------------------
/week2/drafts/es6 class.md:
--------------------------------------------------------------------------------
1 | EcmaScript6 ile gelen Class yapısı ile Nesne Yönelimli Programlama prensiplerini kullanabiliyoruz. (Halen ES6’yı desteklemeyen tarayıcılar vardır.) Classlarda tıpkı fonksiyonlar gibi başka bir ifade içinde tanımlanabilir, değer döndürebilir, atanabilir.
2 | Class yapısı neyi sağlar?
3 | • prototype-based inheritance,
4 | • constructors,
5 | • super calls,
6 | • instance and static methods
7 |
8 | Class yapısını bir örnek üzerinde inceleyelim.
9 |
10 | ```javascript
11 | class User{
12 | constructor(name) {
13 | this.name = name
14 | }
15 | get name() {
16 | return this._name;
17 | }
18 | set name(value) {
19 | if(value.length < 4){
20 | alert("Name is too short.")
21 | return;
22 | }
23 | this._name = value;
24 | }
25 |
26 | sayHi(){
27 | return `Hi, ${this.name}`
28 | }
29 | }
30 |
31 | let user = new User("John");
32 | alert(user.name); //John
33 | user.sayHi() //Hi, John
34 | user = new User(""); // Name is too short.
35 | ```
36 |
37 | Örnekte User adında bir class tanımlanmaktadır.
38 | Constructor: Javascript’te class yapısı tanımlamak için oluşturulan fonksiyonlar, constructor (yapıcı metot) olarak adlandırılır.
39 | Constructor ile de türetilen “user” objesinin ilk değer atamaları yapılmaktadır.
40 | new User: new ile yeni bir obje oluşturulmaktadır. “user” objesi ile User classına erişebilmekteyiz.
41 | Getters/setters: Set name’de this._name’ e yeni değer ataması(setter method), get name ile değerin(getter method) return edilmesi sağlanmakta.
42 |
43 | Class inheritance
44 | Extends Anahtar Kelimesi ve super
45 |
46 | ```javascript
47 | class Animal {
48 | constructor(name) {
49 | this.speed = 0;
50 | this.name = name;
51 | }
52 |
53 | run(speed) {
54 | this.speed = speed;
55 | alert(`${this.name} runs with speed ${this.speed}.`);
56 | }
57 |
58 | stop() {
59 | this.speed = 0;
60 | alert(`${this.name} stands still.`);
61 | }
62 | }
63 |
64 | class Rabbit extends Animal {
65 | hide() {
66 | alert(`${this.name} hides!`);
67 | }
68 |
69 | stop() {
70 | super.stop(); // call parent stop
71 | this.hide(); // and then hide
72 | }
73 | }
74 |
75 | let rabbit = new Rabbit("White Rabbit");
76 | rabbit.run(5); // White Rabbit runs with speed 5.
77 | rabbit.stop(); // White Rabbit stands still. White Rabbit hides!
78 | ```
79 |
80 | Classları geliştirmek için extends anahtar kelimesini kullanılmaktadır. Bu örnekte Rabbit adında bir sınıf oluşturulmakta ve bu sınıfı Animal sınıfından extends edilmekte.
81 | Extend edilen bu sınıf Anaimal classının metot ve nesnelerine erişip, kullanabilmektedir. Bunu super ile parent classının fonksiyonlarını çağrılıp yapmaktadır.
82 | Aynı özellik ve fonksiyonları tekrar yazmadan classı genişleterek kullanabilmekteyiz.
83 |
--------------------------------------------------------------------------------
/week2/drafts/executioncontext&callstack.md:
--------------------------------------------------------------------------------
1 | # Execution Context
2 |
3 | Execution Context, JavaScript engine'in JavaScript kodunu okumak için oluşturduğu ve kodun çalıştırıldığı ortama dair bilgilerin tutulduğu soyut kavrama denir.
4 |
5 | Bir JavaScript kodu çalıştığında öncelikle bilgiler **_memory_** denilen bir yerde tanımlanır ve daha sonra sırasıyla **_execute_** edilir. Bu ilk etapta olan tanımlama global ortamda gerçekleşeceğinden buna **global execution context** denir.
6 |
7 | Herhangi bir fonksiyon çağırıldığında ise yeni bir execution context oluşur. Bu yeni oluşturulan ortamdaki bilgilerin tanımlanması ve excute edilmesine ise **local execution context** denir.
8 |
9 | Bir execution context 2 fazdan oluşur:
10 |
11 | 1. Creation Phase
12 | 2. Execution Phase
13 |
14 | ### Memory Creation Phase
15 |
16 | Bu fazda üç şey meydana gelir:
17 |
18 | 1. Scope belirlenir
19 | 2. Scope Chain belirlenir
20 | 3. `this` değerine karar verilir
21 |
22 | - İlk etapta scope belirlenir. JavaScript'te bir kodun çalıştırılması için öncelikle o kodun ait olduğu ortam taranır. Kodun global ortamda mı yoksa bir fonksiyon tarafından üretilmiş local bir contextte mi çalıştırıldığına bakılır. Bu scope bilgi contextte tutulur.
23 |
24 | 
25 |
26 | \*İkinci etapta ise scope chain belirlenir. Bunun için aşağıdaki kodu inceleyebiliriz.
27 |
28 | var num = 3;
29 |
30 | function foo() {
31 | var num = 6;
32 | function bar() {
33 | return num * 2;
34 | }
35 | return bar();
36 | }
37 |
38 | foo(); // 12
39 |
40 | Burada ilk olarak global execution context tanımlanacaktır. Window ve this gibi global object değerleri belirlendikten sonra num ve foo fonksiyonlarının değerleri tanımlanacaktır.
41 |
42 | `foo()` fonksiyonu çağırıldığı andan itibaren foo için yeni bir execution context oluşturulacaktır. Bu contextin içerisinde ise num ve bar() değerleri tanımlanacaktır.
43 |
44 | `bar()` fonksiyonuna return edildiğinde yani bu fonskiyon çağırıldığında ise bar fonksiyonu için yeni bir context oluşturulacak ve buradaki variableların değerleri belirlenecektir. `bar()` fonksiyonundaki num değeri artık global scopetaki num değeri değil foo fonksiyonundaki num değeri yani 6 olur. Scope chain, `bar()` fonksiyonundaki num değerinin 6 olduğuna karar vermek adına parent ve children scopelara bakılmasıdır.
45 |
46 | [](https://www.linkpicture.com/view.php?img=LPic6014247b679dc716004883)
47 |
48 | - Üçüncü olarak this değeri belirlenir. Global ortamda this değeri global objecte eşitken bir functional execution contextte o fonskiyonun scopeuna bağlı tanımlanır. **_this_** in değeri belirlenirken referans alınan şey ait olduğu fonksiyon olur.
49 |
50 | ### Execution Phase
51 |
52 | Yukarıdaki örneklerde de görüldüğü gibi JavaScript engine her bir işlemi tek tek ve sırasıyla yapar. JavaScript engine her zaman tek bir contexti execute eder.
53 |
54 | Herhangi bir fonksiyon çağırıldığında execution context globalden çıkar ve o fonksiyonu execute etmek için yeni bir context oluşturur. Oradaki tanımlama ve execution sürecinin bitmesini bekler ve oradaki süreç ancak tamamen bittiğinde global ortamına geri döner. Bütün işlemleri sırayla yapması ve aynı anda sadece bir tek context işleyecek şekilde execution thread oluşturması nedeniyle JavaScript **_single-threaded_** olarak tanımlanır.
55 |
56 | # Call Stack
57 |
58 | JavaScript single-threaded bir dil olduğu için her seferinde tek bir fonksiyon execute edilmektedir. Bir JavaScript kodu çalıştırıldığında bütün fonksiyonların çağırıldığı (call) ve depolandığı (stack) ortamı anlamamıza yarayan soyut kavrama **_call stack_** denir. Call stacke giren bütün fonksiyonlar yukarıdan aşağı sıralanır ve sırası ile en son giren fonskiyon ilk önce çıkar, buna **_Last In First Out (LIFO)_** da denmektedir. Her şeyin tek tek ve sırayla işlenmesi nedeniyle call stack aynı zamanda **_senkron_** bir yapıdadır. Bu sebeple JavaScript de single-threaded ve senkron bir dil olarak tanımlanmaktadır.
59 |
60 | 
61 |
62 | Call stack kavramını anlamak JavaScript'te asenkronluğu anlamak için de oldukça önemlidir.
63 |
64 | Örnek olarak aşağıdaki kodu inceleyebiliriz.
65 |
66 | function first() {
67 | console.log("first");
68 | }
69 | function second() {
70 | setTimeout(function() {
71 | console.log("second");
72 | }, 5000);
73 | }
74 | first();
75 | second();
76 | console.log("third");
77 | //first
78 | //third
79 | //second
80 |
81 | Burada fonksiyonlar çağırılma sırası ile call stacke eklenip, last in first out kuralı ile execute edilir. Bu sebeple öncelikle `first()` fonksiyonu call stacke girer ve execute edilerek çıkar. Daha sonra `second()` fonksiyonu girer ancak second fonksiyonunda çağırılan `setTimeout` fonksiyonu asenkronluğu sağlayan bir Web API'dır. Bu fonksiyon ilk parametre olarak bir callback fonksiyonu alır. İkinci olarak da milisaniye cinsinden bir zaman değeri alır. `second()` fonksiyonu execute edilip call stackten çıkacaktır ancak içerisindeki setTimeoutta çağırılan callback fonksiyonu, **_callback queue_** denilen önce girenin önce çıktığı (_first in first out_) başka bir ortamda tutulur. Son olarak da `third()` fonksiyonu callback stacke girip execute edilir ve çıkar.
82 |
83 | First ve third fonksiyonlarının return ettiği değerler direkt olarak execute edildiği için "first" ve "third" console'a basılır. setTimeout() fonksiyonundaki callback, browser tarafında işlenmeye devam edilmektedir ve belirlenen süre dolduğunda yani 5 saniye geçtiğinde callback queue'ya alınır.
84 |
85 | Callback queue'ya bir fonksiyon geldiğinde orayı sürekli dinleyen ve oradaki fonksiyonların execute edilmesinden sorumlu olan bir **_event loop_** mekanizması vardır. setTimeout() ile 5 saniye sonra callback queueya geleceği sözü verilen callback fonksiyonu buraya geldiğinde event loop tetiklenir ve fonksiyon execute edilir. JavaScript'te asenkronluk bu şekilde sağlanır.
86 |
87 | 
88 |
89 | > Call stack sonsuz sayıda fonksiyon almamaktadır. Kendi kendini tekrar eden (recursive) bir fonksiyon çağırıldığında ve durdurulmadığında **_stack overflow_** hatası alınacaktır.
90 |
--------------------------------------------------------------------------------
/week2/drafts/iife.md:
--------------------------------------------------------------------------------
1 | # IIFE
2 |
3 | ## IIFE nedir ?
4 |
5 | JavaScriptte yalnızca bir kez kullanacağımız ve sonrasında tekrar ihtiyacımız olmayacak fonksiyonlar kullanmak zorunda kalabiliriz.
6 | Bu tarz durumlarda tercih ettiğimiz fonksiyonlara "Immediately Invoked Function Expression" (IIEF) adı verilir.
7 | Bu fonksiyonlar tanımlandıkları yerde hemen çağrılarak çalıştırılır.
8 |
9 | ## Kullanım örnekleri nelerdir ?
10 |
11 | Normalde bir fonksiyona ihtiyacımız olduğunda "Function Declaration" ya da "Function Expression" kullanırız ve bu fonksiyonları ihtiyaç duyduğumuz her an çağırıp yeniden kullanabiliriz.
12 |
13 | Function Declaration:
14 |
15 | function calc (p1, p2) {
16 |
17 | return p1 * p2;
18 | }
19 |
20 | alert(calc (4, 3));
21 |
22 | //12
23 |
24 | Function Expression:
25 |
26 | let calc = function (p1, p2) {
27 |
28 | return p1 * p2;
29 | }
30 |
31 | alert(calc (4,3));
32 |
33 | //12
34 |
35 |
36 | Fakat IIEF kullanmayı tercih ettiğimiz durumlarda daha farklı bir yol izleriz.
37 | Alttaki örnek kullanımda görüldüğü gibi fonksiyonumuzu parantez içine aldıktan hemen sonra () kullanarak fonksiyonu tanımlandığı yerde çağırmak istediğimizi belirtiriz.
38 |
39 | * Genel kullanım ;
40 |
41 | ( function () {
42 |
43 | let message = "Hello";
44 |
45 | alert(message); // Hello
46 |
47 | }) ();
48 |
49 | * İsimlendirilerek kullanım;
50 |
51 | ( function doSomething() {
52 |
53 | // do something
54 |
55 | }) ();
56 |
57 | * "Arrow Function" biçiminde kullanım;
58 |
59 | ( () => {
60 |
61 | // do something
62 |
63 | }) ();
64 |
65 |
66 | ## Syntax Hataları
67 |
68 | Fonksiyonu saracak parantezleri kullanmadığımız takdirde JavaScript kod akışında "function" görüp bunu fonksiyon tanımı olarak algılar.
69 | Fakat fonksiyona karşılık gelen bir isim bulamadığı için alttaki hatayı verecektir.
70 |
71 | // Error: Unexpected token (
72 |
73 | // <-- JavaScript fonksiyon ismini bulamadı. ('i gördü ve hemen hata verdi.
74 |
75 | function () {
76 |
77 | let mesaj = "Merhaba";
78 |
79 | alert(mesaj); // Merhaba
80 |
81 | } ();
82 |
83 | İlk durumda karşılaştığımız hatanın sebebi fonksiyonun isimsiz olmasıydı fakat bu problemi fonksiyonu isim ile tanımlayarak da çözemeyiz.
84 | Çünkü JavaScript, fonksiyon tanımlamalarının anında çalışmasına izin vermez ve yine hata verir.
85 |
86 | // Alttaki örnekte ise fonksiyonu anında çalıştırmak için kullandığımız () hata verecektir. Çünkü bu şekilde tanımlanan bir fonksiyon anında çalıştırılamaz.
87 |
88 | function message () {
89 |
90 | let mesaj = "Merhaba";
91 |
92 | alert(mesaj); // Merhaba
93 |
94 | } ();
95 |
96 |
97 | Bu tarz hataları almamak için fonksiyonumuzu () ile sarmamız gerekir.
98 |
99 |
100 | ## IIFE kullanım amacı ve faydaları nelerdir ?
101 |
102 | IIFE'nin temel kullanım amacı, fonksiyon içinde yer alan değerlere dışarıdan erişimi engelleyerek izole bir kapsam oluşturmaktır.
103 | Alttaki örnekten de anlaşılacağı üzere, fonksiyonu saran parantezler sayesinde fonksiyon içindeki değerler sadece bu fonksiyon çağrıldığında kullanılabilecek durumdadır ve dışarıdan erişime izin verilmez.
104 | Bu sayede fonksiyon içindeki değerlerin yanlışlıkla değiştirilmesi gibi istenmeyen durumların önüne geçilmiş olur.
105 |
106 | Bu durumun bir örneğini görelim.
107 |
108 | ( function () {
109 |
110 | let firstName = "Steve";
111 | }
112 | ) ();
113 |
114 | console.log(firstName);
115 |
116 | // Uncaught ReferenceError: firstName is not defined
117 |
118 | Yukarıdaki fonksiyonumuzu çalıştırdığımızda herhangi bir hata ile karşılaşmasak da fonksiyon dışında bir yerde firstName değerine ulaşmak istediğimizde hata aldık.
119 | Çünkü belirtilen değer sadece fonksiyon içinde erişilebilir durumdaydı.
120 | IIFE fonksiyon içinde izole bir kapsam oluşturarak dışarıdan erişimi engellemiş oldu.
121 |
--------------------------------------------------------------------------------
/week2/drafts/readme.md:
--------------------------------------------------------------------------------
1 | Drafts
2 |
--------------------------------------------------------------------------------
/week2/iife.md:
--------------------------------------------------------------------------------
1 | # IIFE
2 |
3 | ## IIFE nedir ?
4 |
5 | JavaScriptte yalnızca bir kez kullanacağımız ve sonrasında tekrar ihtiyacımız olmayacak fonksiyonlar kullanmak zorunda kalabiliriz.
6 | Bu tarz durumlarda tercih ettiğimiz fonksiyonlara "Immediately Invoked Function Expression" (IIEF) adı verilir.
7 | Bu fonksiyonlar tanımlandıkları yerde hemen çağrılarak çalıştırılır.
8 |
9 | ## Kullanım örnekleri nelerdir ?
10 |
11 | Normalde bir fonksiyona ihtiyacımız olduğunda "Function Declaration" ya da "Function Expression" kullanırız ve bu fonksiyonları ihtiyaç duyduğumuz her an çağırıp yeniden kullanabiliriz.
12 |
13 | Function Declaration:
14 |
15 | function calc (p1, p2) {
16 |
17 | return p1 * p2;
18 | }
19 |
20 | alert(calc (4, 3));
21 |
22 | //12
23 |
24 | Function Expression:
25 |
26 | let calc = function (p1, p2) {
27 |
28 | return p1 * p2;
29 | }
30 |
31 | alert(calc (4,3));
32 |
33 | //12
34 |
35 |
36 | Fakat IIEF kullanmayı tercih ettiğimiz durumlarda daha farklı bir yol izleriz.
37 | Alttaki örnek kullanımda görüldüğü gibi fonksiyonumuzu parantez içine aldıktan hemen sonra () kullanarak fonksiyonu tanımlandığı yerde çağırmak istediğimizi belirtiriz.
38 |
39 | * Genel kullanım ;
40 |
41 | ( function () {
42 |
43 | let message = "Hello";
44 |
45 | alert(message); // Hello
46 |
47 | }) ();
48 |
49 | * İsimlendirilerek kullanım;
50 |
51 | ( function doSomething() {
52 |
53 | // do something
54 |
55 | }) ();
56 |
57 | * "Arrow Function" biçiminde kullanım;
58 |
59 | ( () => {
60 |
61 | // do something
62 |
63 | }) ();
64 |
65 |
66 | ## Syntax Hataları
67 |
68 | Fonksiyonu saracak parantezleri kullanmadığımız takdirde JavaScript kod akışında "function" görüp bunu fonksiyon tanımı olarak algılar.
69 | Fakat fonksiyona karşılık gelen bir isim bulamadığı için alttaki hatayı verecektir.
70 |
71 | // Error: Unexpected token (
72 |
73 | // <-- JavaScript fonksiyon ismini bulamadı. ('i gördü ve hemen hata verdi.
74 |
75 | function () {
76 |
77 | let mesaj = "Merhaba";
78 |
79 | alert(mesaj); // Merhaba
80 |
81 | } ();
82 |
83 | İlk durumda karşılaştığımız hatanın sebebi fonksiyonun isimsiz olmasıydı fakat bu problemi fonksiyonu isim ile tanımlayarak da çözemeyiz.
84 | Çünkü JavaScript, fonksiyon tanımlamalarının anında çalışmasına izin vermez ve yine hata verir.
85 |
86 | // Alttaki örnekte ise fonksiyonu anında çalıştırmak için kullandığımız () hata verecektir. Çünkü bu şekilde tanımlanan bir fonksiyon anında çalıştırılamaz.
87 |
88 | function message () {
89 |
90 | let mesaj = "Merhaba";
91 |
92 | alert(mesaj); // Merhaba
93 |
94 | } ();
95 |
96 |
97 | Bu tarz hataları almamak için fonksiyonumuzu () ile sarmamız gerekir.
98 |
99 |
100 | ## IIFE kullanım amacı ve faydaları nelerdir ?
101 |
102 | IIFE'nin temel kullanım amacı, fonksiyon içinde yer alan değerlere dışarıdan erişimi engelleyerek izole bir kapsam oluşturmaktır.
103 | Alttaki örnekten de anlaşılacağı üzere, fonksiyonu saran parantezler sayesinde fonksiyon içindeki değerler sadece bu fonksiyon çağrıldığında kullanılabilecek durumdadır ve dışarıdan erişime izin verilmez.
104 | Bu sayede fonksiyon içindeki değerlerin yanlışlıkla değiştirilmesi gibi istenmeyen durumların önüne geçilmiş olur.
105 |
106 | Bu durumun bir örneğini görelim.
107 |
108 | ( function () {
109 |
110 | let firstName = "Steve";
111 | }
112 | ) ();
113 |
114 | console.log(firstName);
115 |
116 | // Uncaught ReferenceError: firstName is not defined
117 |
118 | Yukarıdaki fonksiyonumuzu çalıştırdığımızda herhangi bir hata ile karşılaşmasak da fonksiyon dışında bir yerde firstName değerine ulaşmak istediğimizde hata aldık.
119 | Çünkü belirtilen değer sadece fonksiyon içinde erişilebilir durumdaydı.
120 | IIFE fonksiyon içinde izole bir kapsam oluşturarak dışarıdan erişimi engellemiş oldu.
121 |
--------------------------------------------------------------------------------
/week3/code/examples.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Document
9 |
10 |
11 |
Heading
12 |
Hey, you're not permitted in there. It's restricted. You'll be deactivated for sure.. Don't call me a mindless philosopher, you overweight glob of grease! Now come out before somebody sees you. Secret mission? What plans? What are you talking about? I'm not getting in there! I'm going to regret this. There goes another one. Hold your fire. There are no life forms. It must have been short-circuited. That's funny, the damage doesn't look as bad from out here. Are you sure this things safe?
13 |
14 | Close up formation. You'd better let her loose. Almost there! I can't hold them! It's away! It's a hit! Negative. Negative! It didn't go in. It just impacted on the surface. Red Leader, we're right above you. Turn to point... oh-five, we'll cover for you. Stay there... I just lost my starboard engine. Get set to make your attack run.
15 |
16 | The Death Star plans are not in the main computer. Where are those transmissions you intercepted? What have you done with those plans? We intercepted no transmissions. Aaah....This is a consular ship. Were on a diplomatic mission. If this is a consular ship...were is the Ambassador? Commander, tear this ship apart until you've found those plans and bring me the Ambassador. I want her alive! There she is! Set for stun! She'll be all right. Inform Lord Vader we have a prisoner.
17 |
18 | What a piece of junk. She'll make point five beyond the speed of light. She may not look like much, but she's got it where it counts, kid. I've added some special modifications myself. We're a little rushed, so if you'll hurry aboard we'll get out of here. Hello, sir. Which way? All right, men. Load your weapons! Stop that ship! Blast 'em! Chewie, get us out of here! Oh, my. I'd forgotten how much I hate space travel.
19 |
20 | Run, Luke! Run!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad animi aspernatur dignissimos dolor eaque enim eos et
20 | excepturi explicabo impedit obcaecati,
21 | perferendis porro possimus quam quia quos rem sint voluptatem.
22 |
23 |
24 |
Another Paragraph
25 |
26 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti dicta dolorem, eligendi eveniet fugiat nisi, non omnis porro quo recusandae sit tempore, totam veritatis voluptates voluptatum? Eum impedit rerum voluptas.
27 |
28 |
29 |
30 | This has a bg class
31 |
32 | This also has a bg class
33 |
34 |