<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ali</title>
    <description>The latest articles on DEV Community by ali (@alimetin).</description>
    <link>https://dev.to/alimetin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2464279%2F195154b0-6eac-4326-8ffb-520e1af0124a.png</url>
      <title>DEV Community: ali</title>
      <link>https://dev.to/alimetin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alimetin"/>
    <language>en</language>
    <item>
      <title>Javascript'te map ve reduce metodlarının kullanımı</title>
      <dc:creator>ali</dc:creator>
      <pubDate>Mon, 01 Sep 2025 14:43:17 +0000</pubDate>
      <link>https://dev.to/alimetin/javascriptte-map-ve-reduce-metodlarinin-kullanimi-1j20</link>
      <guid>https://dev.to/alimetin/javascriptte-map-ve-reduce-metodlarinin-kullanimi-1j20</guid>
      <description>&lt;p&gt;Herkese selamlar,&lt;br&gt;
Bugün tüm projelerde çok sık kullanılan iki fonksiyondan bahsedeceğim. Dizi elemanlarını erişip elemanlarla işlemler yapıp veri üretmemizi kolaylaştıran fonksiyonlardır. Nasıl kullanıldığını, aralarında ne gibi farklılıklar olduğunu bu yazımda anlatacağım.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;map()&lt;/strong&gt;&lt;br&gt;
Dizideki her eleman için yazılan fonksiyonu uygulayıp geriye yeni bir dizi döndüren metotdur.&lt;br&gt;
Hızlıca bir örnek vermek gerekirse;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr = [1, 2, 3, 4];

const newArr = arr.map((x) =&amp;gt; x * 2);

console.log(newArr);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kodun çıktısında &lt;code&gt;[ 2, 4, 6, 8 ]&lt;/code&gt; dizisini görürüz. Burada olan şey map fonksiyonu ile &lt;code&gt;arr&lt;/code&gt; dizisindeki her eleman için &lt;code&gt;(x)=&amp;gt; x * 2&lt;/code&gt; fonksiyonu uygulanır ve &lt;code&gt;newArr&lt;/code&gt; dizisine atanır. &lt;code&gt;x&lt;/code&gt; burada &lt;code&gt;arr&lt;/code&gt; dizisinin her bir elemanını ifade eden parametredir.&lt;/p&gt;

&lt;p&gt;Bu noktada farklı bir örnekle side effect(yan etki) durumlarını inceleyebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const products = [{ name: "sports car" }, { name: "laptop" }, { name: "phone" }];

products.map((product) =&amp;gt; {
  product.price = 100;
});

console.log(products);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;products üzerine &lt;code&gt;map()&lt;/code&gt; fonksiyonu uyguladık fakat yeni bir değişkene atamadık. Ama products dizisini logladığımızda içeriğinin değiştiğini görebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  { name: 'sports car', price: 100 },
  { name: 'laptop', price: 100 },
  { name: 'phone', price: 100 }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada &lt;code&gt;products&lt;/code&gt; dizisi içindeki elemanların obje yani referans tipte oldukları için map fonksiyonu her elemanın referansını alıp işlem yapıyor. Bu ayrıca bir side effect'e neden oluyor.&lt;/p&gt;

&lt;p&gt;Yukarıdaki gibi bir kullanım yerine &lt;code&gt;forEach&lt;/code&gt; metodu daha doğru bir tercih olur. Hem yeni bir değer döndürmez hem dizi içeriğini sideeffect yaratarak değiştirmiş oluruz.&lt;/p&gt;

&lt;p&gt;Şu örnekte ise dizi içindeki elemanlar primitive(ilkel) tip olduğu için diziyi logladığımızda herhangi bir değişiklik gözlemlemeyiz :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const arr = [1, 2, 3, 4];

arr.map((val) =&amp;gt; val * 2);

console.log(arr);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 1, 2, 3, 4 ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak &lt;code&gt;newArr = arr.map((val) =&amp;gt; val * 2);&lt;/code&gt; yaparsak &lt;code&gt;newArr&lt;/code&gt; içerisinde yeni değerleri görebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reduce()&lt;/strong&gt;&lt;br&gt;
Bu metodun temel amacı dizi içindeki değerleri tek bir değere indirgemek olarak söylenebilir. Zaten kelime anlamı olarak &lt;code&gt;reduce&lt;/code&gt; "indirmek, azaltmak, kısmak" anlamına gelir.&lt;br&gt;
Metod bir callback fonksiyonu ve opsiyonel olarak initialvalue değeri alır. &lt;/p&gt;

&lt;p&gt;Aşağıdaki örnekte dizi içindeki elemanların toplamını veren bir reduce metodu uygulamasını inceleyelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const array = [10, 11, 12, 13, 14];

function reducer(accumulator, currentValue, index) {
  const total = accumulator + currentValue;
  console.log(`accumulator: ${accumulator}, currentValue: ${currentValue}, index: ${index}, total: ${total}`);
  return total;
}

array.reduce(reducer);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çıktı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accumulator: 10, currentValue: 11, index: 1, total: 21
accumulator: 21, currentValue: 12, index: 2, total: 33
accumulator: 33, currentValue: 13, index: 3, total: 46
accumulator: 46, currentValue: 14, index: 4, total: 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;accumulator&lt;/code&gt; ara sonuç veya biriktirici diyebiliriz. Her iterasyondan sonra çıkan sonuç accumulator'e atanır. Örnekte bir başlangıç değeri olmadığı için &lt;code&gt;accumulator&lt;/code&gt; array[0] olur.&lt;br&gt;
&lt;code&gt;currentValue&lt;/code&gt; o an ki iterasyonda işlenen elemandır. Initialvalue değeri yoksa array[1] tersi durumda array[0] olur.&lt;br&gt;
&lt;code&gt;index&lt;/code&gt; ise currentValue değerinin dizideki konumu olur.&lt;/p&gt;

&lt;p&gt;Eğer &lt;code&gt;initialValue&lt;/code&gt; değeri &lt;code&gt;array.reduce(reducer, 10)&lt;/code&gt; şeklinde verilirse aynı örnek için çıktı şu şekilde olur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accumulator: 10, currentValue: 10, index: 0, total: 20
accumulator: 20, currentValue: 11, index: 1, total: 31
accumulator: 31, currentValue: 12, index: 2, total: 43
accumulator: 43, currentValue: 13, index: 3, total: 56
accumulator: 56, currentValue: 14, index: 4, total: 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;accumulator&lt;/code&gt; initialValue değerini, &lt;code&gt;currentValue&lt;/code&gt; array[0] ve index &lt;code&gt;0&lt;/code&gt; değerlerini aldığına dikkat edelim.&lt;/p&gt;

&lt;p&gt;Bir başka örnekte gerçek dünyaya daha yakın bir senaryoda reduce metodu şu şekilde kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const cart = [
  { product: "Laptop", price: 15000, quantity: 1 },
  { product: "Mouse", price: 500, quantity: 2 },
  { product: "Keyboard", price: 1200, quantity: 1 }
];

const total = cart.reduce((acc, item) =&amp;gt; {
  return acc + item.price * item.quantity;
}, 0);

console.log(total); // --&amp;gt; 17200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Promise &amp; Async-Await nedir ?</title>
      <dc:creator>ali</dc:creator>
      <pubDate>Tue, 12 Aug 2025 02:03:17 +0000</pubDate>
      <link>https://dev.to/alimetin/promise-async-await-nedir--5d09</link>
      <guid>https://dev.to/alimetin/promise-async-await-nedir--5d09</guid>
      <description>&lt;p&gt;Herkese selamlar,&lt;br&gt;
Başlıktaki iki kavramı açıklamadan önce senkron ve asenkron programlama kavramlarını anlamak promise ve async-await yapılarını anlamamızı kolaylaştıracaktır.&lt;/p&gt;

&lt;p&gt;Senkron programlama çoğu yazılım dilinde varsayılan davranıştır.Kodlar satır satır okunur ve bir işlem bitmeden başka biri başlamaz.&lt;br&gt;
Asenkron programlama ise zaman alan işlemlerin (API istekleri, dosya okuma-yazma, veritabanı sorguları, zamanlayıcılar) arka planda sürdürülmesini ve programın geri kalanının bu işlemler nedeniyle bloklanmadan çalışmasını sağlar. Bu şekilde, özellikle kullanıcı arayüzlerinin donmadan çalışması ve yüksek performanslı uygulamalar geliştirilmesi açısından büyük önem taşır.&lt;/p&gt;

&lt;p&gt;Javascript'te asenkron işlemleri kontrollü biçimde ele alıp doğru şekilde hata yönetimi yapabilmek için promise, async-await yapıları kullanılır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promise&lt;/strong&gt;&lt;br&gt;
Asenkron işlemleri kontrollü şekilde yönetmek için &lt;code&gt;promise&lt;/code&gt; nesnesi kullanılır.&lt;br&gt;
Örneğin bir endpointe get metodu ile istek atıp kullanıcının gönderisini getirmek istiyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getPost() {
  return new Promise((resolve, reject) =&amp;gt; {
    https
      .get("https://jsonplaceholder.typicode.com/posts/1", (res) =&amp;gt; {
        let data = "";

        res.on("data", (chunk) =&amp;gt; {
          data += chunk;
        });

        res.on("end", () =&amp;gt; {
          if (res.statusCode &amp;gt;= 200 &amp;amp;&amp;amp; res.statusCode &amp;lt; 300) {
            try {
              resolve(JSON.parse(data));
            } catch (e) {
              reject("JSON parse hatası: " + e.message);
            }
          } else {
            reject(`Sunucu hatası: ${res.statusCode}`);
          }
        });
      })
      .on("error", (err) =&amp;gt; {
        reject("İstek başarısız: " + err.message);
      });
  });
}

getPost()
  .then((post) =&amp;gt; console.log("Post verisi:", post))
  .catch((err) =&amp;gt; console.error("Hata:", err));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Promise constructor bir executor fonksiyonu bekler. &lt;code&gt;(resolve,reject)=&amp;gt;{}&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;resolve&lt;/code&gt; işlem başarıyla çağrılacak fonksiyon ve &lt;code&gt;reject&lt;/code&gt; işlem başarısızsa çağrılacak fonksiyondur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;then()&lt;/code&gt; işlem bittiğinde verdiğimiz callback fonksiyonunu çalıştırır. &lt;br&gt;
&lt;code&gt;resolve(parametre)&lt;/code&gt; başarılı işlemde resolve içine verdiğimiz parametre &lt;br&gt;
&lt;code&gt;then(function(result){})&lt;/code&gt; metodundaki callback fonksiyonuna parametre olarak verilir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;catch()&lt;/code&gt; işlem sırasında veya  bittiğinde sonuçta hata varsa callback fonksiyonunu çalıştırır. &lt;code&gt;reject(parametre)&lt;/code&gt; metodu içindeki parametre &lt;code&gt;catch(function(error){})&lt;/code&gt; metodundaki callback fonksiyonuna parametre olarak verilir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;finally&lt;/code&gt; promise başarılı, başarısız, hatalı gibi her durumdan bağımsız çalıştırmak istediğimiz zaman kullanılır. &lt;code&gt;finally(() =&amp;gt; console.log("İstek tamamlandı"));&lt;/code&gt; gibi kullanıcıyı bilgilendirmek için kullanılabilir.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Promise durumları (state) şunlardır:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;pending&lt;/code&gt;   Henüz sonuçlanmadı, beklemede.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fulfilled&lt;/code&gt; İşlem başarıyla tamamlandı, &lt;code&gt;resolve()&lt;/code&gt; çağrıldı.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rejected&lt;/code&gt;  İşlem başarısız oldu, &lt;code&gt;reject()&lt;/code&gt; çağrıldı.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Async - Await&lt;/strong&gt;&lt;br&gt;
Bu kullanım ES8 (ECMAScript 2017) standartıyla ile javascript'e eklenmiştir.&lt;br&gt;
Promise ile verdiğimiz örneği &lt;code&gt;async-await&lt;/code&gt; ile kullanmak istersek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchPost() {
  try {
    const post = await getPost();
    console.log("Post verisi:", post);
  } catch (err) {
    console.error("Hata:", err);
  }
}

fetchPost();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;async&lt;/code&gt; anahtar kelimesiyle tanımlanan fonskyion &lt;code&gt;Promise&lt;/code&gt; nesnesi döner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;await&lt;/code&gt; sadece async ile işaretlenen fonksiyon içinde kullanılır. Promise'in çözülmesini (resolve) bekler. Kod bloğu kendi scope'u içerisinde bloklanır. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;try-catch&lt;/code&gt; yapısıyla hata yönetimi &lt;code&gt;reject&lt;/code&gt; durumu yönetilir.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zincirleme &lt;code&gt;then&lt;/code&gt; kullanımı ve &lt;code&gt;async-await&lt;/code&gt; ile karşılaştırması&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getData() {
  return new Promise(resolve =&amp;gt; {
    setTimeout(() =&amp;gt; resolve({ users: [{ id: 42, name: "Ayşe" }] }), 500);
  });
}

function getUserId(data) {
  return new Promise(resolve =&amp;gt; {
    setTimeout(() =&amp;gt; resolve(data.users[0].id), 500);
  });
}

function getUserPost(userId) {
  return new Promise(resolve =&amp;gt; {
    setTimeout(() =&amp;gt; resolve([{ id: 1, userId, title: "Post Başlığı" }]), 500);
  });
}

getData()
  .then(getUserId)
  .then(getUserPost)
  .then(posts =&amp;gt; console.log("Postlar:", posts))
  .catch(err =&amp;gt; console.error("Hata:", err))
  .finally(() =&amp;gt; console.log("Tamamlandı"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchUserPosts() {
  try {
    const data = await getData();
    const userId = await getUserId(data);
    const posts = await getUserPost(userId);
    console.log("Postlar:", posts);
  } catch (err) {
    console.error("Hata:", err);
  } finally {
    console.log("Tamamlandı");
  }
}

fetchUserPosts();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Event Bubbling &amp; Capturing nedir ?</title>
      <dc:creator>ali</dc:creator>
      <pubDate>Tue, 29 Jul 2025 21:01:06 +0000</pubDate>
      <link>https://dev.to/alimetin/event-bubbling-capturing-nedir--1f84</link>
      <guid>https://dev.to/alimetin/event-bubbling-capturing-nedir--1f84</guid>
      <description>&lt;p&gt;Herkese selamlar,&lt;br&gt;
Event bubbling ve event capturing terim olarak biraz yabancı gelebilir ancak kodumuzda sürekli olan iki yaygın javascript davranışıdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Event Bubbling&lt;/strong&gt;&lt;br&gt;
Sayfa tasarımlarında çoğunlukla iç içe geçen birden fazla HTML elementi kullanırız ve çoğunluklada bu elementlere eventler ekleyip ne olup bitiyor haberdar olmak isteriz.&lt;br&gt;
Bu noktada event bubbling davranışıyla karşılaşırız. Örneğin bir parent elementimiz var ve içerisinde bir adet butonumuz var. (Bu herhangi iki elementte olabilir.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="container"&amp;gt;
  &amp;lt;button&amp;gt;Click me!&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;pre id="output"&amp;gt;&amp;lt;/pre&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleClick(e) {
  output.textContent += `You clicked on a ${e.currentTarget.tagName} element\n`;
}
const container = document.querySelector("#container");
container.addEventListener("click", handleClick);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kod örneğini çalıştırdığımızda butona tıklandığında aldığımız output;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You clicked on a DIV element&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Burada buton elementine tıklıyoruz ama div elementi için yazdığımız event tetikleniyor.&lt;br&gt;
Başka bir örnekle bubbling olayını inceleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="parent" onclick="alert('parent div')"&amp;gt;
   &amp;lt;div class="child" onclick="alert('child div')"&amp;gt;
     &amp;lt;p class="text" id="output" onclick="alert('text')"&amp;gt;text&amp;lt;/p&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;P etiketine tıklandığında önce &lt;code&gt;text&lt;/code&gt; sonra &lt;code&gt;child div&lt;/code&gt; en son &lt;code&gt;parent div&lt;/code&gt; uyarı mesajlarını ekranda görürüz. Bubbling olayı en içteki elementten en dıştakine doğru gerçekleşir.&lt;/p&gt;

&lt;p&gt;Bu durumu durdurmak için &lt;code&gt;stopPropagation()&lt;/code&gt; metodu eklememiz yeterli olur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleClick(e) {
  ...
  e.stopPropagation();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Capturing&lt;/strong&gt;&lt;br&gt;
Kısaca bubbling davranışının tersi diyebiliriz. Daha ayrıntılı anlatmak gerekirse DOM eventleri 3 aşamada gerçekleşir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capturing aşaması  - &lt;em&gt;Event, elementler arasında ilerler.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Target aşaması - &lt;em&gt;Event, hedefe ulaşır.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Bubbling aşaması - &lt;em&gt;Event, öğeden yukarı doğru kabarcıklanır.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="parent"&amp;gt;
  &amp;lt;p id="container"&amp;gt;
    &amp;lt;button&amp;gt;Click me&amp;lt;/button&amp;gt;
  &amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;pre id="output"&amp;gt;&amp;lt;/pre&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleClick(e) {
  output.textContent += `You clicked on a ${e.currentTarget.tagName} element\n`;
  e.stopPropagation();
}

const parent = document.querySelector("#parent");
const container = document.querySelector("#container");
const button = document.querySelector("button");

parent.addEventListener("click", handleClick, { capture: true });
container.addEventListener("click", { capture: true });
button.addEventListener("click", handleClick);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çıktıda gördüğümüz;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You clicked on a DIV element&lt;br&gt;
You clicked on a P element&lt;br&gt;
You clicked on a BUTTON element&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;{capture:true}&lt;/code&gt; veya addEventListener içinde parametre olarak &lt;code&gt;true&lt;/code&gt; ifadesiyle bubbling davranışını tersine çevirebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peki javascript'te neden bu tür bir davranış var ?&lt;/strong&gt;&lt;br&gt;
Örneğin onlarca elemanı olan bir listemiz var ve her elemanının bir event ile kontrol etmek istiyoruz. Burada sadece listemize event ekleyerek tüm alt elemanlarına &lt;code&gt;event.target&lt;/code&gt; ile ulaşabiliriz. Burada &lt;code&gt;event.currentTarget&lt;/code&gt; ile eventi ele alan öğeye erişebiliriz. Hem bir standart hem daha tutarlı bir model geliştirilmiştir.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Node.js Event Loop</title>
      <dc:creator>ali</dc:creator>
      <pubDate>Tue, 10 Dec 2024 17:35:31 +0000</pubDate>
      <link>https://dev.to/alimetin/javascript-event-loop-hakkinda-3mg7</link>
      <guid>https://dev.to/alimetin/javascript-event-loop-hakkinda-3mg7</guid>
      <description>&lt;p&gt;Herkese merhaba,&lt;br&gt;
Bu ilk yazımda Javascript'i gerçekten anlamak isteyenlerin kafa yorduğu konulardan biri olan Event Loop(main loop, main thread, event thread,vb...) hakkında yazacağım. Şunuda eklemek istiyorum bu yazı profesyonel şekilde değil, kendim için aldığım notların bir derlemesi niteliğinde olacak. Hatalarım için şimdiden özür dilerim.&lt;br&gt;
Aşağıdaki görselde nodejs içerisinde bulunan javascript v8 engine, event loop mekanizması ve libuv kütüphanesini görüyorsunuz. Javascript' in sağlayamadığı bir takım işleri yürüten libuv kütüphanesidir. Tarayıcıda javascript çalıştırırsak burada tarayıcıların sunduğu web api ile işleri yürütürüz.&lt;/p&gt;

&lt;p&gt;Event loop bir mimari dizayn modelidir(architectural design pattern). Bu yaklaşımın tercih edilme sebebi javascriptin çalışma prensibiyle doğrudan alakalıdır. Javascript single threaded ve Non-Blocking I/O çalışır. Yani tek bir iş parçacığı üzerinde çalışmasına rağmen vakit alan işleri yürütürken bloklanmaz, çalışmaya devam eder. Bunu event loop mimarisiyle çözümler.&lt;/p&gt;

&lt;p&gt;Program çalıştırıldığında Global Execution Context oluşturulur ve call stack'e eklenir. Bu program akışı tamamlanana kadar call stack'ten kaldırılmaz. Aslında her bir fonsksiyon için bir execution context oluşturulur. Fonksiyon işlevi tamamlandığında call stack'ten kaldırılır. Ama her zaman bu şekilde çalışmaz.&lt;/p&gt;

&lt;p&gt;Bazı durumlarda fonksiyon işlevini tamamlaması zaman alır. Örneğin bir ağ isteği veya bir dosyadan veri okuma-yazma işlemi, DOM olayları (tamamı değil) gibi. Bu durumda fonksiyon thread pool veya Web API' lar tarafından işleme alınır. İşlem bittiğinda callback fonksiyonu callback queue (task queue) eklenir. Sırası geldiğinde(call stack boşaltıldığında) call stack'e aktarılır ve işlenir. İşlendikten sonra call stack'ten kaldırılır. Microtask queue' daki işler, callback queue' dakilerden önce işlenir. Bunlara örnek Promise, Mutation Observer, queueMicrotask&lt;/p&gt;

&lt;p&gt;Node.js içinde thread pool, tarayıcılar içinde Web Workers asenkron işlemleri, yoğun CPU gücü gerektiren işleri yürütmek için kullanılır. Kullanımda ve kapsamlarında farklılıklarına burada değinmeyeceğim. Anlatmak istediğim şudur ki; javascript ile üstesinden gelemediğimiz işleri farklı mekanizmalar ile üstesinden gelebilir hale getiriyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv52p2ehekd5qhcio69y9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv52p2ehekd5qhcio69y9.png" alt="Image description" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>eventloop</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Node.js EventEmitter</title>
      <dc:creator>ali</dc:creator>
      <pubDate>Tue, 10 Dec 2024 17:34:45 +0000</pubDate>
      <link>https://dev.to/alimetin/nodejs-eventemitter-2f8i</link>
      <guid>https://dev.to/alimetin/nodejs-eventemitter-2f8i</guid>
      <description>&lt;p&gt;Bugün sizlere EventEmitter sınıfından bahsedeceğim. Bildiğiniz gibi Node.js event-driven yani olay tabanlı bir programlama paradigmasına sahiptir. Bu demek oluyor ki biz bir takım eventler ve callbackler tanımlayacağız, program akışımızda eventlerimiz tetiklenecek ve işleme alınacak. Neden böyle bir yaklaşım benimsenmiş diye sorarsanız bu bir önceki yazımda daha detaylı anlattığım javascript' in single thread çalıştığı için asenkron işlemlerin bir şekilde bloklanmadan ele alınması gerektiği için.&lt;/p&gt;

&lt;p&gt;Peki tüm bunların EventEmitter sınıfıyla ne alakası var diye sorarsanız, bu sınıf bizlere asenkron işlemleri kolayca ele alabileceğimiz bir yapı sunuyor. Aslında bu Observer Design Pattern uygulamasıdır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const EventEmitter = require("events");
class Emitter extends EventEmitter {}

const myE = new Emitter();

myE.on("test", () =&amp;gt; {
  console.log("event meydana geldi.");
});
myE.on("test", () =&amp;gt; {
  console.log("event meydana geldi.");
});
myE.on("test", () =&amp;gt; {
  console.log("event meydana geldi.");
});

console.log(myE.eventNames());

myE.emit("test");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yukarıda bir event nasıl tanımlanır ve çağrılır basit bir örneğini yazdım. Burada "on" metodu aslında boş bir objeye (master object) "test" adında bir dizi oluşturulur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  test: [
    [Function (anonymous)],
    [Function (anonymous)],
    [Function (anonymous)]
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada eventName adıyla üç defa "on" metodu çağırılmış ve oluşan yapı yukarıdaki gibidir.&lt;br&gt;
Tahmin edebileceğiniz gibi "emit" metodu ile "test" isimli event çağrılır. Burada bir foreach metodu test dizisini döner ve içindeki fonksiyonları çağırır. &lt;/p&gt;

&lt;p&gt;Peki bu yapı nerelerde kullanıyor ? &lt;br&gt;
Örneğin bir DOM eventinde;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const btn = document.getElementById("btn");
btn.addEventListener("click", () =&amp;gt; {
  console.log("clicked");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örneğin Node.js uygulamasında bir Ağ isteğinde;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const http = require("http");
const req = http
  .request(
    {
      method: "GET",
      hostname: "jsonplaceholder.typicode.com",
      path: "/todos/1"
    },
    (res) =&amp;gt; {
      res.on("data", (chunk) =&amp;gt; {
        console.log(chunk.toString());
      });

      res.on("end", () =&amp;gt; {
        console.log("response ended.");
      });
    }
  )
  .end();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>eventemitter</category>
      <category>node</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
